【WordPress】カスタムフィールドの値で条件を絞り込み、ループで記事一覧を表示する

※当ブログのリンクには一部広告が含まれています。

この記事では、WordPressのプラグイン「Advanced custom fields(以下ACF)」で作成したカスタムフィールドの値で条件を絞り込み、該当記事を表示させる方法をご紹介します。

「news」というカテゴリーの、カスタムフィールドのチェックボックスにチェックを入れた記事だけ、TOPページに最新記事のタイトルを5件表示する

という場合のコードを考えてみます。特定の記事だけTOPページの新着記事一覧に表示させたい時などに便利です。理屈が分かれば、「チェックを入れた記事は表示させない」という逆パターンもできると思います。

Advanced custom fieldsでカスタムフィールドを作成する

まず、ACFで「show_index」というチェックボックスのカスタムフィールドを作成し、選択肢は「show : TOPページにこの記事を表示する」とします。「show」が値で「TOPページにこの記事を表示する」がラベルになります。

ACFでのカスタムフィールド作成画面

カスタムフィールドの値で条件を絞り込み

ACFで上記のようにカスタムフィールドを作成すると、投稿画面に「TOPページにこの記事を表示する」というチェックボックスが出現するので、TOPページに表示させたい記事にはチェックボックスにチェックを入れます。

カスタムフィールドの値で条件を絞り込み

サンプルコード

<ul>
<?php $args = array(
        'posts_per_page'   => 5, //5件表示する
        'category_name'    => 'news',  //カテゴリー「news」
        'orderby'          => 'date',  //日付順
        'order'            => 'DESC', //降順
        'meta_key' => 'show_index', //カスタムフィールドのキー
        'meta_value' => 'show', //カスタムフィールドの値
        'meta_compare' => 'LIKE' //'meta_value'のテスト演算子
          );
$my_query = new WP_Query($args);
if ($my_query->have_posts()) : while ($my_query->have_posts()) : $my_query->the_post();
?>

<li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>

<?php endwhile; endif; wp_reset_postdata(); ?>
</ul>

カスタムフィールドのパラメーター

meta_key
カスタムフィールドのキー
meta_value
カスタムフィールドの値(文字列として比較)
meta_compare
‘meta_value’のテスト演算子。使える値は ‘!=’, ‘>’, ‘>=’, ‘<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' および 'RLIKE' で、デフォルトは '=' 。

サンプルコードでは、meta_keyが「show_index」、meta_valueが「show」、meta_compareが「LIKE」となっています。
チェックボックスにチェックを入れると、カスタムフィールドの値が「show」になるので、「show_index」と「show」が一致した記事が出力されます。

meta_query」を使うと、配列をひとつまたは複数入れることができるので、複数のカスタムフィールドを組み合わせて検索することも可能です。 配列の「relation」パラメータで、複数のカスタムフィールドの関係を指定します。使える値は ‘AND’と’OR’です。デフォルトは’AND’です。

//単一のカスタムフィールドの場合

$args = array(
      'meta_query' => array(
      array(
            'key'=>'show_index',
            'value'=>'show',
            'compare'=>'LIKE'
      )
   )        
);

//複数のカスタムフィールドの場合
//例:色が赤以外で、値段が500と2000の間にあるものを表示する

$args = array(
     'meta_query' => array(
          'relation' => 'OR',
          array(
               'key'     => 'color',
               'value'   => 'red',
               'compare' => 'NOT LIKE',
          ),
          array(
               'key'     => 'price',
               'value'   => array( 500, 2000 ),
               'type'    => 'numeric',
               'compare' => 'BETWEEN',
          ),
     ),
);

meta_queryのパラメーター

meta_query
(配列)カスタムフィールドの複雑なパラメータ
relation
(文字列)meta_query の中に2つ以上の配列を入れたときの関係を指定します。使える値は’AND’と’OR’です(デフォルト:’AND’)。ひとつだけ配列を入れるときは使用不可。
key
(文字列)カスタムフィールドのキー
value
(文字列|配列)カスタムフィールドの値
compare
(文字列)テスト演算子。使える値は ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS'および'NOT EXISTS'で、デフォルトは'='。
type
(文字列)カスタムフィールドの値のタイプ。使える値は’NUMERIC’, ‘BINARY’, ‘CHAR’, ‘DATE’, ‘DATETIME’, ‘DECIMAL’, ‘SIGNED’, ‘TIME’, ‘UNSIGNED’で、デフォルトは’CHAR’。

カスタムフィールドのパラメーターは以下のリンク先に詳しく書かれています。

Advanced Custom Fieldsを更に使いやすくするACF Pro

Advanced Custom Fieldsでは、次世代バージョンのACFとACFを更にパワーアップさせた高機能なアドオン(The Repeater Field、The Gallery Field、The Flexible Content Field、Clone field、Options Pages)がパッケージ化された「ACF Pro」という有料プラグインが用意されています。私も使っていますが、便利な機能が多く搭載されているのでオススメです。