インターネットブラウザーの進歩に伴い、Webサイトのコーディング時にSVGSを使用することがますます快適になりました。特に、アイコンや、オンザフライでpngに置き換えることができるシンプルなグラフィックについては特にそうです。
ワードプレスはほとんどSVGSをサポートしているようです。私はほとんど理由でこう言います:
デフォルトでは、ワードプレスで許可されているファイルタイプではありません。そのため、SVGをアップロードする前に追加する必要があります
メディアギャラリーにSVGサムネイルが表示されない。(下の画像を参照)
(メディアの追加ボタンを使用して)エディターに追加する場合、エディターはsvgサイズを認識しないことがあります。そのため、svgを画像として追加しますが、幅と高さがゼロです。
メディアアップロードポップアップ内から「画像の編集」をクリックすると、「画像が存在しません」というメッセージが表示されます。下の画像を参照してください。
このリストの項目1で問題ありませんが、項目2、3、および4を修正する方法を誰かが理解していますか?
アイテム1に関する更新:
新しいMIMEタイプ(SVGなど)を許可するには、functions.phpにフックを追加するだけです。
function allow_new_mime_type($mimes) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter( 'mime_types', 'allow_new_mime_type' );
これで、SVGをアップロードできるようになります。詳細については、このチュートリアルをご覧ください。これは、前に述べたように、私にとっては問題ではない(デフォルトでは許可されているはずですが)項目1のみを解決します。
アイテム2に関する更新:
添付ファイルが画像かどうかを判断する機能を掘り下げて追跡しました。すべてはwp-includes / post.phpのこの関数に帰着しているようです
/**
* Check if the attachment is an image.
*
* @since 2.1.0
*
* @param int $post_id Attachment ID
* @return bool
*/
function wp_attachment_is_image( $post_id = 0 ) {
$post_id = (int) $post_id;
if ( !$post = get_post( $post_id ) )
return false;
if ( !$file = get_attached_file( $post->ID ) )
return false;
$ext = preg_match('/\.([^.]+)$/', $file, $matches) ? strtolower($matches[1]) : false;
$image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );
if ( 'image/' == substr($post->post_mime_type, 0, 6) || $ext && 'import' == $post->post_mime_type && in_array($ext, $image_exts) )
return true;
return false;
}
ご覧のとおり、この関数で定義されている有効な画像拡張子の配列があります。その配列を変更するために使用できるフィルターはありません。しかし、それは始まりです...
しかし、最後のifステートメントがsvgに対してfalseを返す理由はわかりません。$ image_exts配列にsvg拡張機能を追加しない場合でも、最初の条件はtrueを返す必要がありますね。
if ( 'image/' == substr($post->post_mime_type, 0, 6)
これは、「image /」がMIMEタイプの最初の6文字と等しいかどうかをチェックします。svgの場合、image / svg + xmlです(最初の6文字は「image /」)。
更新
詳しい調査の結果、問題はwp_attachment_is_imageにはまったくないようですが、SVGのアップロード時に画像のサイズ(幅と高さ)が添付ファイルのメタデータに追加されていないためです。これは、使用される画像を計算する関数が、SVGの画像サイズを返さないphp関数getimagesize()であるためです。getimagesize関数とsvgsの動作について、stackoverflowで答えを見つけました。こちらをご覧ください。