【WordPress】投稿一覧にカスタム〇〇のタームや値を表示する
そのままタイトルにすると長くなるので、〇〇でまとめさせて頂きました。
全部書くと、「投稿一覧にカスタムタクソノミーのタームやカスタムフィールドの値を表示する」です。
こちらで追加したカスタムフィールドの値やカスタムタクソノミーのタームを表示するのに、コードを書かなければならないのは管理画面でも変わりません。
投稿の分類や整理でカスタムタクソノミーやカスタムフィールドを用意した場合、投稿一覧で表示されている方が管理する側としては楽です。
カラムの内容で呼び出せばOK
やることは前回の記事である、「投稿一覧にパーマリンク等を設置する」とほぼ変わりません。
ざっくりと、カラムを挿入して、そのカラムの中で表示する項目を関数で用意します。
カラムの並べ替えの方法もこちらの記事に書いてあるので、参考にしていただければ幸いです。
では、指定のカラムにカスタムフィールドの値とカスタムタクソノミーの値を呼び出していきます。
カスタムフィールドの値を挿入する
と言っても、カスタムフィールドの値を表示するための関数はすでに用意されているわけで。
投稿一覧でもそれを利用します。
自作の場合はget_post_meta()、Advanced Custom Fieldsを使っている場合はget_field()あたりですね。
投稿一覧と呼んでいるように、すでに投稿を表示するためのループは実行されています。
なのでカスタムフィールドの値を呼び出してreturnすれば、指定したカラムに表示されます。
//Advanced Custom Fieldsを利用してカスタムフィールドを作成している場合
function add_column_display( $column_name, $post_id ){
if( $column_name == 'test_fields' ){
$test_value = get_field( 'test-value', $post_id );
//functions.phpで自作している場合
//$test_value = get_post_meta( $post_id, 'test-value', true );
}
echo $test_value;
}
add_action( 'manage_test_posts_custom_column', 'add_column_display' );
カスタム投稿タイプ’test_posts’のカスタムフィールド’test-value’の値を、投稿一覧の’test_fields’という名前のカラムに表示する。
というアクションフックです。
カラムの中身への設定なので、アクションフックはmanage_posts_custom_columnを利用します。
カスタムタクソノミーのタームを挿入する
例えば、「勉強」というカスタムタクソノミーを作成したとすると。
その中に「国語」「数学」「英語」といった教科というカテゴリーを作成した場合。
この「国語」「数学」「英語」がタームに当たります。
各投稿で選択されているタームを投稿一覧に挿入するには、投稿に紐づいたターム一覧を取得できるwp_get_object_terms()を利用します。
//タームの表示
function custom_term_column_display( $column_name, $post_id ){
if( $column_name == 'test-terms' ){
$taxonomy = wp_get_object_terms( $post_id, 'test_select_term' );
$name = $taxonomy[0]->name;
}
if( isset( $name ) && $name ){
echo esc_attr( $name );
}
}
add_action( 'manage_test_posts_custom_column', 'custom_term_column_display' );
wp_get_object_terms()で、タクソノミーのスラッグが’test_select_term’で$post_idに紐づくタームの情報を配列で取得できます。
取得したタームの情報の中で使用したいのはタームの名前なので、配列の最初($taxonomy[0])を指定しnameのラベルの値を呼び出します。
そして、選択されているタームがあるかを検証し呼び出します。
タームを複数選択している場合は、foreachで呼び出せば良いでしょう。
カスタムタクソノミーで投稿を絞り込む
カスタム投稿の値やカスタムタクソノミーのタームを投稿一覧に表示するということは、どんな分類にしたかの確認だけでなく絞り込みもできると便利です。
カスタム投稿の場合、初期状態だと投稿日のみのため、カスタムタクソノミーでの絞り込みは設定しないとできません。
なので、投稿一覧にカスタムタクソノミーのセレクトボックスを追加します。
<?php
//カスタムタクソノミーでソートする
function taxonomy_restrict_filter(){
global $post_type;
if( $post_type == 'test_posts' ){
?>
<select name="test-select-list">
<option value="">指定なし</option>
<?php
$terms = get_terms( 'test_taxonomy_terms' );
foreach( $terms as $term ){
?>
<option value="<?php echo $term->slug; ?>"
<?php
if( $_GET['test-select-list'] == $term->slug ){
print 'selected';
}
?>>
<?php echo $term->name; ?>
</option>
<?php } ?>
</select>
<?php
}
}
add_action( 'restrict_manage_posts', 'taxonomy_restrict_filter' );
アクションフックのrestrict_manage_postsで投稿一覧での絞り込みに使用するボックスを用意することができます。
セレクトボックスに表示するタームはカスタム投稿’test_posts’に紐づいているので、’test_posts’の投稿一覧の時のみ表示されるように条件分岐します。
以降はセレクトボックスをHTMLで設定していきます。
get_terms()で’test_taxonomy_terms’のターム情報を配列で取得して、foreach()で選択値に入れます。
検索フォームはGETで送信されるため、絞り込みに使用した値と選択値が同じであれば、選択済みで表示されるようになっています。
記事が増えてくると便利な機能
子テーマのfunctions.phpを編集している中で、管理画面の項目も書いていくとズラッとコードが並びますね。
テーマ作成で使用先ごとにPHPファイルを分ける理由が良くわかります。
カスタム投稿やカスタムタクソノミーを利用して記事の管理を行う場合、投稿一覧で表示できれば「この記事はどのカテゴリー?」と迷った時に、内容の関連性の高い記事で使用したカテゴリーと同じものにすることができますし。
投稿した記事をまとめるのに、タクソノミーでソートできると多少は作業が楽になります。