Steamer Lane Studio技術備忘録ワードプレス

WordPressでACFによるカスタムフィールドで特定のフィールドを含めての検索

wordpress WordPressでACFによるカスタムフィールドで特定のフィールドを含めての検索
最終更新日: 2023年4月15日

これもポータルサイト案件から。
ポータルサイトっても検索精度を高めるうえで拾って欲しくないものもあるわけで、その逆もまた然りで細分化させてUIを高めたいってことからthe_contentに含ませない情報を別途フィールドに配して検索対象とした。
準備としてfunction.phpに特定のACFによるフィールドを検索対象とするコードを記述。
ここではACFで「access」ってフィールドを作ってそこも検索対象に入れる。

function custom_search($search, $wp_query) {
global $wpdb;
if (!$wp_query->is_search) return $search;
if (!isset($wp_query->query_vars)) return $search;
$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
if ( count($search_words) > 0 ) {
$search = '';
$search .= "AND post_type = 'post'";
foreach ( $search_words as $word ) {
if ( !empty($word) ) {
$search_word = '%' . esc_sql( $word ) . '%';
$search .= " AND (
{$wpdb->posts}.post_title LIKE '{$search_word}'
OR {$wpdb->posts}.post_content LIKE '{$search_word}'
OR {$wpdb->posts}.ID IN (
SELECT distinct post_id
FROM {$wpdb->postmeta}
WHERE {$wpdb->postmeta}.meta_key IN ('access') AND meta_value LIKE '{$search_word}'
)
) ";
}
}
}
return $search;
}
add_filter('posts_search','custom_search', 10, 2);

検索のinputとボタンとか。例によってclassやidは適当に。

<form role="search" method="get" id="searchform" class="searchForm" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<div>
<h3>検索ワードから検索</h3>
<input name="s" type="text" class="search-field" value="<?php echo get_search_query(); ?>" id="sb" placeholder="検索ワード入力" />
<?php /*<input type="hidden" name="s" id="sb2" value="">*/?>//使うことがあったら使う
<button type="submit" class="search-submit">検索</button>
<p>例:「検索ワード1」「検索ワード2」</p>
</div>
</form>

検索結果一覧

<?php
global $wp_query;
$total_results = $wp_query->found_posts;
$search_query = get_search_query();
?>
<h2><?php echo $search_query; ?>での検索結果</h2>
<?php //検索内容に該当するものがあった場合?>
<?php if( $total_results >0 ): ?>
<?php if(have_posts()): while(have_posts()): the_post(); ?>
<div>
<a href="<?php echo get_permalink(); ?>">
<div class="pdimgWrap">
<img src="<?php the_post_thumbnail_url('thumbnail', array('class' => 'alignnone')); ?>" alt="<?php the_title(); ?>" />
<?php //用途に応じ次の<を<へ変更<?php the_post_thumbnail('thumbnail', array('class' => 'alignnone')); ?>//記事のサムネ拾う時だね
</div>
<h3><?php the_title(); ?></h3>
</a>
</div>
<?php endwhile; endif; ?>
<!-- /#result-wrap --></section>
<?php wp_reset_postdata(); ?>
<?php //検索内容に該当するものがなかった場合?>
<?php else: ?>
<div id="result-list">
<h3><?php echo $search_query; ?>はありません。</h3>
<!-- /#result-wrap --></section>
<?php endif; ?>