WordPress初心者の備忘録。
知識がほぼないため意図した形にするまでかなり手こずりました。
やりたかったのは、通常の「投稿タイプ」に「カスタムタクソノミー」を追加し、それを記事内とサイドバーに表示させること。
今後のために手順をまとめておきます。
カスタム投稿タイプとは
このブログでは以前、通常の「投稿タイプ」と併用して「カスタム投稿タイプ」も利用していました。
「カスタム投稿タイプ」とは、通常の「投稿タイプ」とは構成の異なる、もうひとつの「投稿」を作成できる機能のこと。
例えば、このブログでは記事の内容によって「日常」「子供の成長」「お出掛け」などでカテゴリー分けをしています。

カテゴリーの分類はいくつでも追加できますが、「カテゴリー」自体は1種類です。
「カスタム投稿タイプ」では、この「カテゴリー」自体の種類を増やすことができます。
以前は「カスタム投稿タイプ」を利用して「食べ歩き」の記事を作成していましたが、
カテゴリーが1種類しかない場合、食べたジャンル、食べたエリアなどをカテゴリーとして追加したとしても、それらが全て一緒くたのグループにまとめられてしまいます。
「カスタム投稿タイプ」を利用し、カテゴリーを増やすことができると、このようなまとめ方ができるようになります。

「カスタム投稿タイプ」でのカテゴリーやタグの分類のことを「カスタムタクソノミー」、その中の項目を「ターム」と呼びます。
「カスタム投稿」自体も、必要に応じていくつでも追加することができます。
カスタム投稿をやめて、通常の投稿でひとまとめにする
以前は、「投稿タイプ」で通常のブログを、「カスタム投稿タイプ」で食べ歩きのほか、ペットや備忘録のブログを分けて管理していました。
少し前にそれを面倒に感じてしまい、すべて通常の「投稿タイプ」にまとめ、「食べ歩き」「ペット」「備忘録」などを新たなカテゴリーとして追加しました。
「食べ歩き」記事で使っていた「エリア」「ジャンル」の「カスタムタクソノミー」(カテゴリー)は消滅することになり、それぞれの「ターム」を「タグ」として登録しました。
が、
それだと「A地区」「B地区」で探したい、「ラーメン」「寿司」で探したいというときに、無秩序に溢れかえった「タグ」の中から探さなければなりません。
これでは非常に使いづらい。
そこで、通常の「投稿タイプ」に新たなカテゴリー、「カスタムタクソノミー」を追加し、以前のように「ジャンル」「エリア」ごとに項目(ターム)まとめられるようにしてみました。
実際の構造はこんなふうになります。

これを、カテゴリー「食べ歩き」を閲覧しているときのみ「ジャンル」「エリア」が表示されるよう設定することで、見せかけの構造をこんな感じにしたい、という試みです。

カスタムタクソノミーを追加する
初っ端から手こずりました。
「カスタム投稿タイプ」での「カスタムタクソノミー」の追加方法は調べればいくらでも出てくるのですが、
通常の「投稿タイプ」に追加する方法を見つけられず、オープンAIの助けを借りながら作業をすすめました。
少しでも知識があれば何てことのない部分だったと思います…
次のコードを「functions.php」に記述します。
その前に、「functions.php」の編集でエラーが発生すると、私のような初心者ではパニックに陥ることもあるので、編集前にバックアップを取ることをお勧めします。
// 「投稿」にカスタムタクソノミーを追加する
add_action( 'init', 'create_custom_taxonomies', 0 );
function create_custom_taxonomies() {
// 1つ目のタクソノミー
register_taxonomy(
'area', // タクソノミーのスラッグ
'post', // 紐付ける投稿タイプ(通常の投稿は 'post')
array(
'label' => 'エリア', // タクソノミーの表示
'hierarchical' => true, // trueでカテゴリー形式、falseでタグ形式
'show_in_rest' => true, // ブロックエディターで表示させる
)
);
// 2つ目のタクソノミー
register_taxonomy(
'genre',
'post',
array(
'label' => 'ジャンル',
'hierarchical' => true,
'show_in_rest' => true,
)
);
「タクソノミーのスラッグ」と「タクソノミーの表示」部分に任意の文字を入れます。
ここでは、タクソノミー:「エリア」・スラッグ:「area」と、タクソノミー:「ジャンル」・スラッグ:「genre」の2つを追加しました。
管理画面内メニュー「投稿」を見てみると、通常の「カテゴリー」「タグ」の下に新たなタクソノミーが追加されました。

これで記事作成時に、通常のカテゴリーとは別に追加したタクソノミーも登録することができるようになります。
記事内にカスタムタクソノミーの情報を表示する
こんなふうに、記事内にタクソノミーの情報を表示したい。

以前は自作テーマを使用していたので、自分で「single.php」内をいじることができたのですが、
現在は超便利な「cocoon」を利用させていただいてるので、「ウィジェット」を使用して「投稿本文上」に表示させることにしました。
ここで困ったことがひとつ。
「ウィジェット」では「PHPコード」を使用することができません。
プラグインを使えば一番簡単なのですが、前に「PHPコード」が利用できるプラグインで不具合が発生し、原因をつきとめるのにかなり苦労したことがあるので、できることならプラグインに頼りたくない。
そこで、「functhions.php」にカスタムタクソノミーの情報を表示させる「PHPコード」を記述し、「ウィジェット」から「ショートコード」でその内容を呼び出すことにしました。
【functions.php】
// 記事内にカスタムタクソノミーを表示する
add_shortcode('widget_php_genre', function() {
global $post;
// 記事ページ(single)の場合のみ、タクソノミーを表示
if ( is_single() ) {
return get_the_term_list( $post->ID, 'genre', 'ジャンル:', ', ' );
}
});
add_shortcode('widget_php_area', function() {
global $post;
// 記事ページ(single)の場合のみ、タクソノミーを表示
if ( is_single() ) {
return get_the_term_list( $post->ID, 'area', 'エリア :', ', ' );
}
});
書き換えるのはこの部分だけ。
add_shortcode('PHPコードを呼び出すためのショートコード', function() {
return get_the_term_list( $post->ID, '①タクソノミーのスラッグ', '②タームの先頭に表示する文字列', '③ターム間に表示する文字列' );
では次に、ウィジェットの「カスタムHTML」にPHPコードを呼び出すショートコードを記述します。

先ほど「functions.php」で設定した「PHPコードを呼び出すためのショートコード」を [ ] で囲むだけ。
で、このままだと関係ないカテゴリーの記事にも表示されてしまうので、
「表示設定」を「チェック・入力したページで表示する」にし、カテゴリーで「食べ歩き」にチェックを入れます。
これで「食べ歩き」カテゴリーの記事のみ、指定した場所にカスタムタクソノミーの情報が表示されます。
サイドバーにカスタムタクソノミーの一覧を表示する
同じようにショートコードを使って、カスタムタクソノミーの一覧をサイドバーに表示させようとしたのですが、意図した体裁にならずに断念。
あれこれ色々試してみましたが、どうしても上手くいかず、最終的にウィジェットの「タグクラウド」で解決しました。

「タグクラウド」内に「タクソノミー」という項目が追加されていたため、ここで任意のタクソノミーを指定。
先ほどと同じように「表示設定」で「食べ歩き」のみ表示するように設定します。

見た目はCSSで変えられるのでしょうが、デフォルトのままでも気に入っているので、とりあえずこのまま。
404エラーが出た場合
最後に、項目(ターム)をクリックしてアーカイブページを確認してみましたが、
ここでまさかの「404」エラー。

自作テーマでは「archive.php」というファイルを作成して表示していた記憶があったので、
この「cocoon」でそれをまた新しく作るのか?かなり難しいのでは!?と狼狽してしまいましたが、
これは拍子抜けするほどあっさり解決しました。
その方法は、管理画面の「設定」→「パーマリンク」で、何もしないで「変更を保存」をクリックするだけ。
アーカイブページに新しく追加したカスタムタクソノミーの一覧が無事表示され、これでなんとか作業が完了。
あとは、以前設置していた「エリア」+「ジャンル」というカスタムタクソノミーの組み合わせによる「サイト内検索」も復活させたかったのだけど、
今回は初歩的なところで四苦八苦し続けて疲れてしまったので、気力が回復した頃にまたトライしたいと思います…


COMMENT