【WordPress】検索キーワードの対象にカスタムフィールドを含める

電脳備忘録

以前、カスタムフィールドを含む検索とNGワードの設定に対応した。今回はNGワード機能が不要だったのでNGワード機能削除版を用意したときのメモ。

<?php
$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
global $wp_query;
$total_results = $wp_query->found_posts;
// 検索結果表示 カスタムフィールドを含める
global $wpdb;
// If you use a custom search form
$keyword = get_search_query();
$keyword = '%' . $wpdb->esc_like( $keyword ) . '%'; // Thanks Manny Fleurmond
// Search in all custom fields
$post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT post_id FROM {$wpdb->postmeta}
WHERE meta_value LIKE '%s'
", $keyword ) );
// Search in post_title and post_content
$post_ids_post = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT ID FROM {$wpdb->posts}
WHERE post_title LIKE '%s'
OR post_content LIKE '%s'
", $keyword, $keyword ) );
$post_ids = array_merge( $post_ids_meta, $post_ids_post );
// Query arguments
$args = array(
'post_type'   => 'post',
'posts_per_page' => -1,
'order'          => 'DESC',
'post_status'    => 'publish',
'post__in'    => $post_ids,
);
$s_query = new WP_Query( $args );
?>
<div class="search-result-wrapper">
<h2>検索結果</h2>
<ul>
<?php if( (!($post_ids)) || (isset($_GET['s']) && empty($_GET['s'])) ) :?>
<!-- 検索条件にヒットしなかった場合 または 検索条件が指定されていない場合 -->
<li>「<?php the_search_query(); ?>」に一致する情報は見つかりませんでした。</li>
<?php else: ?>
<!-- 検索がHitした場合 -->
<?php if ( $s_query->have_posts() ): while ( $s_query->have_posts() ) : $s_query->the_post(); ?>
<li>
<!-- 検索結果をここに書く -->
</li>
<?php endwhile; else: ?>
<li>「<?php the_search_query(); ?>」に一致する情報は見つかりませんでした。</li>
<?php endif; ?>
<?php endif; ?>

Advanced Custom Fieldを使うことが多いので、検索機能は基本これで実装すればいいかな。

広告

ブログの維持費に充てるでございます・・・。