1. トップページ
  2. カスタムフィールドの値をURLパラメータを使用して部分一致で検索する

カスタムフィールドの値をURLパラメータを使用して部分一致で検索する

Advanced Custom Filed で設定したカスタムフィールドの値をURLパラメータを使用して部分一致で検索してみます。

開発環境

下記の環境で動作を確認しました。

WordPress 5.2.2
LocalbyFlywheel 3.0.4
Advanced Custom Filed 5.8.5


実際のコード

カスタムフィールドの名前と値はURLパラメータで指定します。クロスサイトスクリプティング(XSS)には注意してください。

https://example.com/page/?key=[カスタムフィールド名]&value=[カスタムフィールドの値]


たとえば下記のようなURLの場合、pageというカスタムフィールドにtanakaという値が含まれている記事を一括で出力します。

https://example.com/page/?key=name&value=tanaka


実際のコードは下記の通りになります。コピーして表示させたい場所に貼り付けしてください。

$key = $_GET["key"];
$value = $_GET["value"];

$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
  'post_type' => 'post',
  'orderby' => array( 'meta_value_num' => 'ASC', 'date' => 'DESC', ),
  'meta_key' => $key,
  'meta_query' => array(
    array(
      'key'=>$key,
      'value'=>$value,
      'compare'=>'LIKE'
    )
  ),
  'posts_per_page' => 10,
  'paged' => $paged,
);
$query = new WP_Query( $args );

if( $query -> have_posts()){
  while ( $query->have_posts() ) {
    $query->the_post();

    $cat = get_the_category();
    $cat_ttl =  the_title('','', false);
    $cat_name = $cat[0]->cat_name;
    $post_img = get_the_post_thumbnail_url( get_the_ID(), 'medium' );
    $content = get_the_content();
    $content = wp_trim_words( $content, 78, '[...]' );

    echo $cat_ttl;
    echo $cat_name;
    echo $content;
  }
  $GLOBALS['wp_query']->max_num_pages = $query->max_num_pages;
  wp_reset_postdata();
}


解説

まずは変数を指定します。
$keyはカスタムフィールド名、$valueはカスタムフィールドの値が入ります。

$key = $_GET["key"];
$value = $_GET["value"];


設定した変数を使用してサブループの準備を行います。
meta_querycompareの値をLIKEにすることで部分一致を実現しています。
他にも =!= など様々な指定方法があります。詳しくは公式のリファレンスを確認してください。
クラスリファレンス/WP Meta Query - WordPress Codex 日本語版

$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
  'post_type' => 'post',
  'orderby' => array( 'meta_value_num' => 'ASC', 'date' => 'DESC', ),
  'meta_key' => $key,
  'meta_query' => array(
    array(
      'key'=>$key,
      'value'=>$value,
      'compare'=>'LIKE'
    )
  ),
  'posts_per_page' => 10,
  'paged' => $paged,
);
$query = new WP_Query( $args );


準備が完了したので、実際に出力を行います。
記事名, カテゴリ名, 本文しか出力しないように設定していますので、好きなように書き換えしてください。

if( $query -> have_posts()){
  while ( $query->have_posts() ) {
    $query->the_post();

    $cat = get_the_category();
    $cat_ttl =  the_title('','', false);
    $cat_name = $cat[0]->cat_name;
    $content = get_the_content();

    echo $cat_ttl;
    echo $cat_name;
    echo $content;
  }
  $GLOBALS['wp_query']->max_num_pages = $query->max_num_pages;
  wp_reset_postdata();
}


以上になります。お疲れ様でした。

参考にさせていただいたページ

参考サイトなし