企業サイトとかやってると、ページごと、あるいは投稿のカテゴリごとに専用のビジュアルを出したくなりますよね。
それをなるべく自動でやる方法をコピペを駆使して考えてみました。
その時の覚書というかメモというか…落書きです。
仕様を考えてみる
いろいろ方法はあると思いますが、今回はスラッグを利用することにしました。
固定ページなら今いるページのスラッグを取得して「スラッグ名.jpg」とかを表示するようにすれば狙ったことができそうです。
投稿ならカテゴリーでよさそうですので、こちらもカテゴリスラッグで同じようにできると思います。
他にもカスタムフィールドを使うとか、アイキャッチを利用するなんてのも考えましたが、
いずれの場合もカテゴリーリストの時にうまく表示できない可能性がありますので今回は却下で。
スラッグの取得
固定ページは楽勝です。
1 2 |
$page = get_page(get_the_ID()); echo $page->post_name; |
これでスラッグが取れます。
固定ページは日本語でタイトルをつけるとスラッグも日本語かつエンコードされた状態で保存されるので、
パーマリンク設定を変えているならパーマリンクの部分で英語表記に、デフォルトの場合は「表示オプション」から 「スラッグ」を選択してスラッグのフィールドを出してあげてそこに英語でスラッグを登録しておきましょう。
次に投稿ですが、これも
1 2 |
$cat = get_the_category(); echo $cat[0]->category_nicename; |
こんなかんじで行けそうですね。
ですが、これだとカテゴリーを階層化してる場合、子カテゴリにいるときはうまく取れません。
なので、この記事にならってfunctions.phpにこう書いてみました。
1 2 3 4 5 |
function get_category_top($ID) { $p = get_category_parents($ID,false,',',true); $pArr = explode(',',$p); return $pArr[0]; } |
こうすると、小カテゴリの記事にいてもちゃんと親カテゴリのスラッグを取れます。
これで記事は解決できそうですが、これだと子カテゴリの一覧にいるときうまくいきません。
小カテゴリごとに画像を変える場合は更に細かい分岐を書くしか無いのですが、
それのやり方についてはフォーラムとかにヒントがありそうです。
今回は子カテゴリのときも親と同じテンプレートでいきますので、
WordPress私的マニュアルさんが紹介しているこの方法でいけそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
add_filter( 'category_template', 'my_category_template' ); function my_category_template( $template ) { $category = get_queried_object(); if ( $category->parent != 0 && ( $template == "" || strpos( $template, "category.php" ) !== false ) ) { $templates = array(); while ( $category->parent ) { $category = get_category( $category->parent ); if ( !isset( $category->slug ) ) break; $templates[] = "category-{$category->slug}.php"; $templates[] = "category-{$category->term_id}.php"; } $templates[] = "category.php"; $template = locate_template( $templates ); } return $template; } |
これをfunctions.phpに書くだけで、子カテゴリテンプレがないときは親を、親もなければ共通のカテゴリテンプレートをという風になるみたいです。
これでだいたい準備はできました。
実際にテーマに表示させる
最後にメインビジュアルのエリアをこんなかんじに書き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php if(is_home()): ?> <div class="mainvisual"> <img src="PATH/TO/KEYVISUAL" width="980" height="370" alt=""></div> </div> <?php else: ?> <?php // カテゴリー一覧と投稿 if (is_category() || is_single()) { $common_head_visual = get_bloginfo('stylesheet_directory').'/img/headers/'.attribute_escape(get_category_top($cat)).'.jpg'; } // 固定ページ if (is_page()) { $page = get_page(get_the_ID()); $common_head_visual = get_bloginfo('stylesheet_directory').'/img/headers/'.$page->post_name.'.jpg'; } ?> <h3 class="pagehead" style="background-image:url(<?php echo $common_head_visual; ?>);"><p> <?php if (is_category()) { single_cat_title(); } else { the_title(); } ?> </p></h3> |
PATH/TO/KEYVISUAL の部分は、トップページ用のメインビジュアル画像のパスに書き帰るなり、
header_image();にするなりしてください。
これでトップページの時はメインビジュアルを、
下層のときはテンプレートフォルダ以下の「img/headers」フォルダを参照し、
「カテゴリ・投稿」の場合は「カテゴリスラッグ.jpg」を、
「固定ページ」の場合は「固定ページのスラッグ.jpg」を自動で表示するようになります。
9行目及び14行目の「get_bloginfo(‘stylesheet_directory’).’/img/headers/’」を適切に書き換えることで、参照する画像フォルダを変更することもできます。
さいごに
一応これで表示はできるようになりましたが、画像の参照先的に、これだとFTPで画像を予めまとめてアップしておく必要があります。
通常はそれでも平気かもしれませんが、テンプレートフォルダは結構WPの深いところにありますので、場所がわかりにくくなる場合は、別の場所にフォルダを作ってそちらを参照してもいいかもしれませんね。
WP附属のメディアライブラリやアップローダを利用する場合は、デフォルトのままだと月ごとにフォルダを分けていくためにそのままだとアップロードしたタイミングによっては表示ができなくなってしまいます。
これについては「設定」の「メディア」にある「アップロードしたファイルを年月ベースのフォルダに整理」を外せば解決できそうですが、あとで手動でライブラリを整理するときとかは面倒くさそうですね。そんな機会がどれほどあるかはわかりませんが。
また、いずれの場合でも、ファイル名を自動設定させるために、ファイル名とスラッグを揃えておく必要があるので、予め命名規則などのルールぎめが必要です。
このへんは構成時にサイトマップを引くときとかに一緒に決めてしまってもいいと思います。
また、今回はjpgで決め打ちしちゃってますので、他のファイル形式(PNGとかGIF)だとやっぱり表示できません。
もっと柔軟にやりたい場合はこのへんも考えなくてはなりませんね…。
イマイチまとまってませんが、とりあえずこのへんで。。
コメントする