MENU

post_thumbnail_htmlフックを使って、画像周りを一括管理する方法

  • URLをコピーしました!

WordPressのテーマ【JIN】を子テーマでカスタマイズするにあたり、ゴリゴリカスタマイズしていると、アップデートがあった時に、ファイル差分チェックの必要があります。

ちょっと面倒臭いなと思い始めて、WordPressのフィルターを使って、出来るだけファイルをシンプルにすることにしました。

WordPressのテーマ【JIN】本体もサムネイル部分のソースが何度も表示されているので、こうしたら簡素化できるよ!という例でもあります。

the_post_thumbnailにはフィルターがある

WordPressのテーマでサムネイル表示をする際、the_post_thumbnailを使いますが、記事ページやカテゴリーページなどでは、表示サイズが異なると思います。

トップページやカテゴリーページ、アーカイブページなどソースが同じ場合、同じテーマ内に同じソースを何度も表示する際、管理上面倒臭いです。

それらを1つにまとめて、WordPressのテーマを管理しやすいように、post_thumbnail_htmlフックを使います。

post_thumbnail_htmlの使い方

WordPress Codex 日本語版には掲載されていません。

なので、WordPressの本家で確認してください。
と言っても例が載っていないので分かりづらいので、私の適当に書いたソースで我慢してください…。
※私はプログラマーではなく、あくまでマークアップエンジニアです(^_^;)

一応私がカスタマイズしたものをGithubに載せてきます。

ですが、このソース動作するか分かりません(^_^;)
このソースは元々画像を外部URLにするようにカスタマイズしていたものを、かなり削ぎ落として掲載しています。

また、このソースはecho.jsを導入済みを想定して書いています。

function custom_thumnail($html, $post_id, $post_image_id,$size,$attr){
if(has_post_thumbnail()){
if(is_single() && ! wp_is_mobile()){ //singleページ&PCアイキャッチ用
$eyecatch = get_the_post_thumbnail( 'large_size' );
$html = '<img src="';
$html .= 'ローディング画像URL';
$html .= '" data-echo="';
$html .= $eyecatch;
$html .= '" alt="';
$html .= get_post_meta( $post_image_id, '_wp_attachment_image_alt', true );
$html .= '" '.getimagesize($eyecatch)[3].'>';
$html .= '<meta itemprop="url" content="'.$eyecatch.'">';
$html .= '<meta itemprop="width" content="'.getimagesize($eyecatch)[0].'">';
$html .= '<meta itemprop="height" content="'.getimagesize($eyecatch)[1].'">';
}elseif(is_single() && wp_is_mobile()){ //singleページ&モバイルアイキャッチ用
$eyecatch = get_the_post_thumbnail( 'cps_thumbnails' );
$html = '<img src="';
$html .= 'ローディング画像URL';
$html .= '" data-echo="';
$html .= $eyecatch;
$html .= '" alt="';
$html .= get_post_meta( $post_image_id, '_wp_attachment_image_alt', true );
$html .= '" '.getimagesize($eyecatch)[3].'>';
$html .= '<meta itemprop="url" content="'.$eyecatch.'">';
$html .= '<meta itemprop="width" content="'.getimagesize($eyecatch)[0].'">';
$html .= '<meta itemprop="height" content="'.getimagesize($eyecatch)[1].'">';
}elseif(is_post_list_style() == "magazinestyle"){
if(wp_is_mobile() && !is_post_list_style() == "magazinestyle-sp1col"){
$thumb = wp_get_attachment_image_src($post_image_id,'cps_thumbnails');
$html .= '<meta itemprop="url" content="'.$thumb[0].'">';
$html .= '<meta itemprop="width" content="'.$thumb[1].'">';
$html .= '<meta itemprop="height" content="'.$thumb[2].'">';
}else{
$thumb = wp_get_attachment_image_src($post_image_id,'small_size');
$html .= '<meta itemprop="url" content="'.$thumb[0].'">';
$html .= '<meta itemprop="width" content="'.$thumb[1].'">';
$html .= '<meta itemprop="height" content="'.$thumb[2].'">';
}
}elseif(is_post_list_style() == "basicstyle"){
if(wp_is_mobile()){
$thumb = wp_get_attachment_image_src($post_image_id,'cps_thumbnails');
$html .= '<meta itemprop="url" content="'.$thumb[0].'">';
$html .= '<meta itemprop="width" content="'.$thumb[1].'">';
$html .= '<meta itemprop="height" content="'.$thumb[2].'">';
}else{
$thumb = wp_get_attachment_image_src($post_image_id,'small_size');
$html .= '<meta itemprop="url" content="'.$thumb[0].'">';
$html .= '<meta itemprop="width" content="'.$thumb[1].'">';
$html .= '<meta itemprop="height" content="'.$thumb[2].'">';
}
}
}else{//NO Imageの時
if(is_post_list_style() == "magazinestyle"){
if(wp_is_mobile() && ! is_post_list_style() == "magazinestyle-sp1col"){//スマホ
$html = '<img src="';
$html .= 'プリローダー画像URL';
$html .= '" data-echo="';
$html .= get_jin_noimage_url();
$html .= '" width="320" height="180" alt="no image">';
$html .= '<meta itemprop="width" content="320">';
$html .= '<meta itemprop="height" content="180">';
}else{//PC
$html = '<img src="';
$html .= 'ローディング画像URL';
$html .= '" data-echo="';
$html .= get_jin_noimage_url();
$html .= '" width="640" height="360" alt="no image">';
$html .= '<meta itemprop="url" content="'.get_jin_noimage_url().'">';
$html .= '<meta itemprop="width" content="640">';
$html .= '<meta itemprop="height" content="360">';
}
}elseif(is_post_list_style() == "basicstyle" || is_related_type() == "slide"){
if(wp_is_mobile()){
$html = '<img src="';
$html .= 'プリローダー画像URL';
$html .= '" data-echo="';
$html .= get_jin_noimage_url();
$html .= '" width="320" height="180" alt="no image">';
$html .= '<meta itemprop="url" content="'.get_jin_noimage_url().'">';
$html .= '<meta itemprop="width" content="320">';
$html .= '<meta itemprop="height" content="180">';
}else{
$html = '<img src="';
$html .= 'ローディング画像URL';
$html .= '" data-echo="';
$html .= get_jin_noimage_url();
$html .= '" width="480" height="270" alt="no image">';
$html .= '<meta itemprop="url" content="'.get_jin_noimage_url().'">';
$html .= '<meta itemprop="width" content="480">';
$html .= '<meta itemprop="height" content="270">';
}
}
}
return $html;
}
add_filter('post_thumbnail_html','custom_thumnail',10,5);
view raw custom_thumnail hosted with ❤ by GitHub

上記のソースをfunctions.phpに記載して、画像表示している全て(prevnext.php以外を除く)のphpファイルの画像部分を下記に書き換えます。

例えば、single.phpのアイキャッチの場合は、下記に書き換えます。

<?php echo the_post_thumbnail(); ?>

この方法は、functions.phpで全てのファイルの画像部分を制御できるので、管理がしやすくなります。

the_post_thumbnailを挿入する場所によって画像サイズを変えたい場合は、下記のように記載します。

<?php echo the_post_thumbnail('cps_thumbnails'); ?>

もし上記の画像サイズ(JINテーマでいうと、large_size、small_size、cps_thumbnails)で条件分岐をしたい場合は、下記のソースでできます。

function custom_thumnail($html, $post_id, $post_image_id,$size,$attr){
    if($size == 'large_size'){
    }elseif($size == 'small_size'){
    }elseif($size == 'cps_thumbnails'){
    }
}

応用の幅が広がりますよね!

今回はJINテーマに合うように書きましたが、他のテーマでも応用ができます。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

WordPress1X歴のテーマ開発者がWordPressの有料テーマを購入したのがキッカケで、WordPressのカスタマイズTipsを纏めています。

コメント

コメントを残す

This site uses Akismet to reduce spam. Learn how your comment data is processed.