妥協的な部分もあるバッドノウハウな気はしますが、かなり時間をかけてなんとかしたので、忘れないうちにその際のいろいろをメモとして。
前提と実現したいこと
タイトルでは分かりにくいので、箇条書にて実現したいことを書きます。
前提
かなり作り込まれた既存テーマをカスタムする必要があるとします。
このテーマをカスタムするためには、テンプレートファイルは一切触らずにfunctions.phpにフックを使って行う必要があります。
実現したいこと
実現したいことは以下の通り。
- カテゴリーごとに画像とテキストを表示させる
- カテゴリーは増減する
- 管理画面からの操作だけで操作を完結する
上記を実現するために考えた手段は以下の通り。
- 管理画面(ダッシュボード)のカテゴリー管理ページにカスタムフィールドを設定する
- single.phpにカスタムフィールドの値を出力するためのコードを入れる
解決方法
カテゴリー編集画面にカスタムフィールドを設置して利用する方法は、下記の記事で詳しく記載されています。テーマを直接カスタムするならこれだけでほぼ終わりでしょう。
WordPressのカテゴリーにカスタムフィールドを追加する
php初心者の無能を痛感しますが、上記のページのコードをfunctions.phpに上手く入れ込めませんでした。
エラーは潰せても、肝心のカスタムフィールドの値がとれない始末。
そこで、やり方を変えて下記の方法で実現しました。
なお、今回問題となったのは表示の部分だけですので、それ以外は前述のリンク先をご確認ください。
カスタムフィールドの値を表示する
カスタムフィールドの値を表示するために新たにphpファイルを作り、それをfunctions.phpに読み込みます。
仮にcategory-info.phpと名前をつけ、以下の内容を記述し保存します。
<?php
$cat = get_the_category();
$cat = $cat[0];
$cat_id = $cat->cat_ID;
$cat_data = get_option('cat_'.$cat_id);
$key1 = $cat_data['extra_text'];
$key2 = $cat_data['img'];
if( $key1 || $key2 ){
$cat_parts ='<div class="wrap">';
if($key1){
$cat_parts .= '<p>'.esc_html($cat_data['extra_text']).'</p>';
}
if($key2){
$cat_parts .= '<img src="'.esc_url($cat_data['img']).'"/></a>';
}
$cat_parts .='</div>';
echo $cat_parts;
}
変数に取り込んで結合したりしていますが、その辺りは他の意図もあったりでご勘弁を。
すべてechoでもヒアドキュメントでもよいかと思います(厳密にはどうなのか自信がありませんが)。
上記以外で前述の内容との違いは、カテゴリーの情報取得のためにget_the_category()を使った点と、カステムフィールドで設定したテキスト(['extra_text'])と画像のURL(['img'])の値があるかないかで分岐を作った程度です。
例えば設定したテキストを出力する際にpタグで囲むと、中身が無い時にはpタグだけが残ってしまいます。
そこで、設定したテキストを$key1に入れて、$key1に中身があればpタグごと表示させるようにしたのが以下の部分です。
if($key1){
$cat_pr_parts .= '<p>'.esc_html($cat_data['extra_text']).'</p>';
}
ちなみに、functions.phpではだいたい以下のようにしました。コンテンツの終わりにあるフックを指定して関数を実行する形です。
add_filter('フック名','add_extra');
function add_extra() {
if (is_single()) {
locate_template( array( '/category-info.php' ), true, true );
}
}
結び
今回触ったテーマのフックの細かさは素晴らしいと思う反面、必要としている箇所を探すのがなかなか骨が折れました。
配布サイトにあったフックの一覧は部分的でしたし、テーマを追って確認してはみたものの実際に試してみないと場所があっているのかよくわからない始末…。
もっとちゃんした書き方があると思いますので、今後も精進せねばと思います。
0人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。