カスタムフィールドの値を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_query
のcompare
の値を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();
}
以上になります。お疲れ様でした。
参考にさせていただいたページ
参考サイトなし