検索結果ページ構築ベース

検索結果ページ構築ベース

■検索用フォーム

<form action="<?php echo esc_url(home_url('/')); ?>search/" method="GET">
  <input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s"  placeholder="キーワードを入力してください" />
  <input type="submit" value="検索">
</form>

■投稿フィールドの検索(search.php)

<?php get_header(); ?>
  <?php
    $search_str = isset($_GET['s']) ? $_GET['s'] : '';
    $search_str = esc_html(stripslashes($search_str));
    $param         = array(
      'posts_per_page' => -1,
      'orderby'        => 'date',
      'order'          => 'DESC',
      'post_status'    => 'publish',
      'post_type'      => array('post'), //複数の場合カンマで区切る
      'exact'          => false, //部分一致
      's'              => $search_str
    );
    $wpQuerySearch = new WP_Query($param);
  ?>
  <?php
      $paramCount = array(
        's'            => $s,
        'showposts'    =>  -1,
        'post_type'      => array('post')
      );
      $allsearch = new WP_Query($paramCount);
      $key = wp_specialchars($s, 1);
      $count = $allsearch->post_count;
  ?>
  <h1>「<?php echo $key ?>」で検索した結果<?php echo $count ?>件</h1>
  <?php if ($wpQuerySearch->have_posts()) : ?>
    <ul class="resultList">
      <?php while ($wpQuerySearch->have_posts()) : $wpQuerySearch->the_post(); ?>
      <li><a href="<?php the_permalink() ?>"><?php echo strip_tags(get_the_title()); ?></a></li>
      <?php endwhile; ?>
    </ul>
  <?php else : ?>
    <div class="noResult">
      <h1 class="hTitle"><span>検索結果はありません。</span></h1>
      <p class="txt">「<?php echo $key; ?>」に一致するページは<br>見つかりませんでした。</p>
    </div>
    <ul class="btns">
        <li class="btn"><a href="<?php echo esc_url(home_url('/'));?>"><span>トップページへ戻る</span></a></li>
    </ul>
  <?php endif; ?>
  <?php wp_reset_postdata(); ?>
  <!-- /#content -->
<?php get_footer(); ?>

■カスタムフィールドの値を検索内容範囲に含む(search.php)

<?php get_header(); ?>
  <?php
    $keyword = get_search_query();
    $keyword = '%' . like_escape( $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 );
    $param         = array(
      'post_type'   => 'post',
      'post_status' => 'publish',
      'post__in'    => $post_ids,
    );
    $wpQuerySearch = new WP_Query($param);
  ?>
  <?php
      $paramCount = array(
        's'            => $s,
        'showposts'    =>  -1,
        'post_type'      => array('post')
      );
      $allsearch = new WP_Query($paramCount);
      $key = wp_specialchars($s, 1);
      $count = $wpQuerySearch->post_count;
  ?>
  <h1>「<?php echo $key ?>」で検索した結果<?php echo $count ?>件</h1>
  <?php if ($wpQuerySearch->have_posts()) : ?>
    <ul class="resultList">
      <?php while ($wpQuerySearch->have_posts()) : $wpQuerySearch->the_post(); ?>
      <li><a href="<?php the_permalink() ?>"><?php echo strip_tags(get_the_title()); ?></a></li>
      <?php endwhile; ?>
    </ul>
  <?php else : ?>
    <div class="noResult">
      <h1 class="hTitle"><span>検索結果はありません。</span></h1>
      <p class="txt">「<?php echo $key; ?>」に一致するページは<br>見つかりませんでした。</p>
    </div>
    <ul class="btns">
        <li class="btn"><a href="<?php echo esc_url(home_url('/'));?>"><span>トップページへ戻る</span></a></li>
    </ul>
  <?php endif; ?>
  <?php wp_reset_postdata(); ?>
  <!-- /#content -->
<?php get_footer(); ?>

———————————————

■検索結果にページャを設置する場合
 http://hoge.com/search/のように検索結果をディレクトリとして設定している場合に起こった。
 ページャの設定を変更する必要があるので注意。
 WP-PageNaviが動かない場合の解決策

参考サイト

Welcart カスタマイズ ブログ
プラグインなしでカスタムフィールドの値を検索範囲に反映させる方法
http://welcustom.net/extend-custom-fields-in-search/