[wp]カスタム投稿一覧への表示をカスタムフィールドで制御する方法

小ネタ。

活用シーン

カスタム投稿の一覧を設置する。
一覧の設置場所は複数あって、「ここに表示させたい・させたくない記事」が発生したとする。
タームでの選り分けができない、向かない状態であった時、一覧への表示・非表示をカスタムフィールドで制御しようという話。

構築環境

SmartCustomFieldsで作る。

Smart Custom Fields
Smart Custom Fields はカスタムフィールドを管理するシンプルなプラグインです。

でも他の方法で作ったカスタムフィールドでも動く。

組み方

カスタム投稿「CustomPostSample」を10件、真偽フィールド「show」が「true」であるものを表示する。

<?php
$myposts = new WP_Query(array(
    'post_type' => 'CustomPostSample',
    'posts_per_page'=> 10,
    'post_status' => 'publish',
    'meta_key' => 'show',
    'meta_value' => true,
));
?>
<?php if($myposts->have_posts()): ?>
    <?php while($myposts->have_posts()): $myposts->the_post(); ?>
中身
    <?php endwhile; ?>
<?php endif; ?>

見たままだけど、「meta_key」「meta_value」で判定に使うカスタムフィールドのキーと値を指定する。これは真偽なので「true」をベタ打ち。値が文字列であれば「’」で囲って記述。

ポイント

keyだけでなく値も条件の対象なので、値の内容に表記ブレがあると動作しない。なので基本的には真偽、またはselectとかradioで「特定の値を選択」できる状態を組むのがいい。

ダメな例

要するに「カスタムフィールドの条件分岐」なんだけど、以下の内容は良くない。

<?php
$myposts = new WP_Query(array(
    'post_type' => 'CustomPostSample',
    'posts_per_page'=> 10,
    'post_status' => 'publish',
));
?>
<?php if($myposts->have_posts()): ?>
    <?php while($myposts->have_posts()): $myposts->the_post(); ?>
        <?php if(SCF::get('show')): ?>
中身
        <?php endif; ?>
    <?php endwhile; ?>
<?php endif; ?>

何がよくないって、10件出力した中から「偽」を除いてるので、10件の中に「偽」が混ざってたら表示されるのは10件じゃなくなる。今回の目的はカスタムフィールドを通した上で10件表示するところにあるので、これは解釈違いになる。

記事全てを出力する前提で組むなら結果は同じになるんでこれでもいいんだけど。それでもwhileで回して出力判定が出たものを丸々除外するのは無駄な手間が発生してるんで、前提がどうあれやっぱりお薦めはできない。

オマケ的なもの

「meta_query」を使えば複数のカスタムフィールドを設定することもできる。

カスタムフィールドの値を指定した記事一覧の表示方法 | コトダマウェブ
ここでは、投稿で記事一覧を表示させるサブループにカスタムフィールドの値を条件として指定する方法について見ていきます。カスタムフィールドの作り方を知らない方は、はじめにこちらをご覧ください。

とはいえ、条件をつけるだけでも大したもんだと思うレベルなんで、複数指定まで組み込む必要が出てくるっていうのはよっぽどのことなんじゃないかと。道理があってそんな形に構築するのならいいけど、因果を逆転させてわざわざこれありきで作るというのは絶対にやめたほうがいい。

20230224追記:値の有無で判別する方法

例えば、カスタムフィールド「image」に画像を登録してるものだけをピックアップしたい場合。

<?php
$myposts = new WP_Query(array(
    'post_type' => 'CustomPostSample',
    'posts_per_page'=> 10,
    'post_status' => 'publish',
    'meta_query'  => array(
        array(
            'key'     => 'image',
            'value'   => '',
            'compare' => '!='
        )
    ),
));
?>

コメント

タイトルとURLをコピーしました