WordPressでプラグイン「Advanced Custom Fields」を使用した際の、タクソノミーの出力方法についての備忘録です。
やりたいこと:カスタム投稿、タクソノミーの表示
- プラグインを使わずに、カスタム投稿タイプ、カスタムタクソノミーを追加。
- プラグイン「Advanced Custom Fields」でカスタムフィールドを作成。
- 1と2を紐付け、カスタムフィールドから入力→投稿した内容をサイトに表示させる。
つまづいた点:タクソノミーの返り値がタームID
Advanced Custom Fieldsで、フィールドタイプが「テキスト」「数値」「テキストエリア」のものは、ソースに<?php the_field(‘フィールド名’); ?>を追加することで表示されたが、「タクソノミー」については期待した値が表示されなかった(公式サイト通りに記述しても、なぜか上手く表示されず)。
原因:タームIDが取得されていた。
※返り値にタームIDを選択していたため(デフォルト値)、当然といえば当然だったのですが。。。
やったこと:タームオブジェクトから名前を取得
今回やってみた内容について、始めから順に記述していきます。
カスタム投稿タイプ「書籍」の作成
function.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 26 27 28 29 30 |
// カスタム投稿タイプ function book_post_type() { register_post_type( 'book', // 名称 array( 'label' => '書籍', // 管理画面に表示するラベル 'hierarchical' => false, // false:階層を持たない投稿記事型 'public' => true, // true:管理画面にメニュー表示 'query_var' => false, // false:query-varキーを使用しない 'menu_position' => 5, // 「投稿」の下に表示 'has_archive' => true, // 最新記事の一覧を生成するかどうか 'supports' => array('title') // 有効にする機能の指定 ) ); } add_action('init', 'book_post_type'); // カスタムタクソノミー function book_taxonomy() { register_taxonomy( 'book_cat', // 名称 'book', array( 'label' => '書籍カテゴリー', 'hierarchical' => true, // true:階層を持つ固定ページ型 'show_admin_column' => true // 管理画面の一覧に表示 ) ); } add_action('init','book_taxonomy'); |
「書籍カテゴリー」の追加
管理画面にカスタム投稿タイプ「書籍」が追加されたので、書籍>書籍カテゴリーより、新規カテゴリーを追加します。
試しに、「専門書」「小説」「雑誌」の3つを追加してみました。
Advanced Custom Fieldsの設定
1.プラグイン「Advanced Custom Fields」でフィールドグループ「書籍」を作成します。
2.下記のフィールドを追加します。
フィールドラベル | フィールド名 | フィールドタイプ |
著者 | b_author | テキスト |
書籍カテゴリー | b_category | タクソノミー |
価格 | b_price | 数値 |
本の概要 | b_about | テキストエリア |
フィールド名「書籍カテゴリー」の設定内容
- フィールドラベル:書籍カテゴリー
- フィールド名:書籍カテゴリー
- フィールドタイプ:タクソノミー
- フィールド記入のヒント:空白
- 必須か?:いいえ
- タクソノミー:book_cat ※作成したカスタム投稿タイプ
- フィールドタイプ:セレクトボックス
- 無を許可するか?:いいえ
- タームの読み込み/保存:チェックあり ※チェックを入れないと、管理画面→書籍→書籍カテゴリーのカウントが更新されない
- 返り値:タームID ※追記あり(アーカイブページの表示 〜返り値がTerm Objectの場合〜)
- 条件判定:いいえ
カスタム投稿タイプ「書籍」の投稿
管理画面の書籍>新規追加より、新しい記事を投稿します。
- タイトル:WordPress入門
- 書籍名:W.Press
- 価格:3000
- 本の概要:WordPressの基本的な内容について。
- 書籍カテゴリー:「専門書」にチェック
アーカイブページの表示 〜返り値がタームIDの場合〜
カスタム投稿タイプ書籍用に、archive-book.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 26 27 28 29 30 31 32 33 34 35 36 |
<?php get_header(); ?> <div id="main" class="container"> <div id="posts"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div class="post"> <div class="post-header"> <h2> <a href="<?php echo the_permalink();?>"><?php the_title(); ?></a> </h2> </div><!-- /post-header --> <?php // the_content(); ?> <!-- 本文の出力はコメントアウト --> <p>著者:<?php the_field('b_author'); ?></p> <p>カテゴリー: <?php $term_id = get_field('b_category'); // タームID取得 $term = get_term( $term_id, 'book_cat' ); // タームオブジェクト取得 echo $term->name; // タームオブジェクトの名前を出力 ?> </p> <p>価格:<?php the_field('b_price'); ?>円</p> <p>本の概要:<?php the_field('b_about'); ?></p> </div><!-- /post --> <?php endwhile; ?> <div class="navPage"> <div class="prev"><?php previous_posts_link(); ?></div> <div class="next"><?php next_posts_link(); ?></div> </div><!-- /navPage --> <?php else: ?> <div class="article"> <p>現在お知らせはありません。</p> </div><!-- /article --> <?php endif; ?> </div> </div> <?php get_footer(); ?> |
解説
16行目で、選択したタームのタームIDが取得されるので、変数$term_idに格納します。
17行目で、ターム ID を指定してタームの全データをデータベースから取得し、変数$termに格納します。
18行目で、タームの名前を参照し、出力します。
アーカイブページの表示 〜返り値がTerm Objectの場合〜
追記:こちらの方がよりシンプルで、公式サイトと同様の記述で表示出来ました。
フィールド名「書籍カテゴリー」の設定内容の返り値を下記に設定します(他は変更なし)。
- 返り値:Term Object
アーカイブページの表示 〜返り値がタームIDの場合〜の14〜20行目を下記に置き換えます。
14 15 16 17 18 19 20 |
<p>カテゴリー: <?php $term = get_field('b_category'); // タームオブジェクト取得 if( $term ): ?> <?php echo $term->name; ?> // タームオブジェクトの名前を出力 <?php endif; ?> </p> |
解説
16行目で、タームオブジェクトが取得されるので、変数$termに格納します。
18行目で、タームの名前を参照し、出力します。
結果:タクソノミーの表示成功
期待通りの値(専門書)が表示されました!
一度理解すると難しい内容ではありませんでしたが、だいぶハマってしまいました。
最初から、返り値をTerm Objectに設定しておくべきでした。
以上です。
続き→【WordPress】管理画面のカスタム投稿タイプ投稿一覧のカスタマイズ
子育ての一番大変な時ではないかと思い恐縮ですが、質問です。
ACFでカスタムタクソノミーを使った場合、カスタムタクソノミーの画面の方で、「カウント」のところに、カウントされなくないですか?
ここで言うと、「書籍カテゴリー」の管理画面で「専門書」のカウントが増えない、ということです。
返信が大変遅くなり申し訳ございません。
コメントありがとうございます。
たしかに、カウントが増えておりませんでした。
管理画面より、
カスタムフィールド(ACF)→書籍→カテゴリー(編集)→タームの読み込み/保存:チェックあり
に設定変更したところ、カウントされるようになりました。
ご指摘ありがとうございました!