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

電脳備忘録

本記事のソースコードの利用によって生じた損害について、当方は一切の責任を負いません。ご自身の判断と責任のもとで参照・ご利用ください。

この記事は最終更新から2年以上経過しています。

以前、カスタムフィールドを含む検索と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を使うことが多いので、検索機能は基本これで実装すればいいかな。

0%