jugedred
11/17/2017 - 1:29 PM

検索の対象をタイトルのみにする

<?php
/**
* 検索の対象をタイトルのみにします。
*/
function posts_search_title_only( $orig_search, $query ) {
  // http://wpcj.net/1709
  // $query->is_main_query() を除いて、フィルターが設定されればどのクエリでも対象になるようにします。
  if ( $query->is_search() && ! is_admin() ) {
  // 4.4, 4.5のWP_Query::parse_search()の処理を流用しています。(検索語の分割処理などはすでにquery_vars上にセット済のため省きます)
  global $wpdb;
  $search = '';
  $q = $query->query_vars;
  $n = ! empty( $q['exact'] ) ? '' : '%';
  $searchand = '';
  foreach ( $q['search_terms'] as $term ) {
    $include = '-' !== substr( $term, 0, 1 );
    if ( $include ) {
      $like_op = 'LIKE';
      $andor_op = 'OR';
    } else {
      $like_op = 'NOT LIKE';
      $andor_op = 'AND';
      $term = substr( $term, 1 );
    }
    $like = $n . $wpdb->esc_like( $term ) . $n;
    // タイトルのみ
    $search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s))", $like );
    $searchand = ' AND ';
  }
  if ( ! empty( $search ) ) {
    $search = " AND ({$search}) ";
    if ( ! is_user_logged_in() )
      $search .= " AND ($wpdb->posts.post_password = '') ";
    }
    return $search;
  } else {
    return $orig_search;
  }
}

==========================================================

// タイトルのみで検索するフィルターを設定します。
add_filter( 'posts_search', 'posts_search_title_only', 10, 2 );

// クエリ。好きな条件を設定してください。
$q = new WP_Query(array(
's' => 'テスト', // 検索したい単語
'posts_per_page' => 5
));

// タイトルのみで検索するフィルターをすぐに解除します。
remove_filter( 'posts_search', 'posts_search_title_only', 10, 2 );