てくてくあるく

WordPress の テーマ とか プラグイン に ついて 勉強しています

Main Content

ワードプレス の 検索対象を 投稿 かつ 数字のみ かつ タイトルのみ かつ 完全一致 に する必要があったので 調べてみました!!


まずは 検索対象を 投稿のみ に したい場合です

これは 結構 使用頻度 が 高いかな?? って 思います

//---------------------------------------------------------------------------
//  クエリ処理
//  検索対象 は 投稿のみ
//---------------------------------------------------------------------------

add_action( 'pre_get_posts', function ( $query ) {
  if( ! $query->is_admin && $query->is_main_query() ) {
    if( $query->is_search ) {
      // 検索対象を 投稿のみに
      $query->set( 'post_type', array( 'post' ) );
    }
  }
} );

こんな感じで 検索対象 が 投稿 のみ に なります

他に 検索結果ページでは 1ページに表示する最大投稿数 を 無制限にしたい場合 は

      // 1ページに表示する最大投稿数 無制限
      $query->set( 'posts_per_page', -1 );

を 追記してあげる って 感じです


次に 検索ワード を 数字のみに 変換します

まずは 文字列から 数字のみになる関数を 作ってしまいます

//---------------------------------------------------------------------------
//  数字のみ取得
//---------------------------------------------------------------------------

if( !function_exists( 'onlyNumbers' ) ) {
  function onlyNumbers( $val ) {
    
    // 半角数字 変換
    $return  = mb_convert_kana( $val, 'n', 'utf-8' );
    
    // 半角数字以外除去
    $return  = mb_ereg_replace( '[^0-9]', '', $return );
    
    return $return;
  }
}

こんな感じ!!

型は 調べてないので エラー処理は 各々 やってくださいな…

で 次に 検索文字列を 先ほどの 関数を通して 元に戻してあげれば OK!!

場所は さっきと同じ所に 追記する

//---------------------------------------------------------------------------
//  クエリ処理
//  検索対象 は 投稿のみ
//  検索文字 を 変換
//---------------------------------------------------------------------------

add_action( 'pre_get_posts', function ( $query ) {
  if( ! $query->is_admin && $query->is_main_query() ) {
    if( $query->is_search ) {
      
      // 検索対象を 投稿のみに
      $query->set( 'post_type', array( 'post' ) );
      
      // 1ページに表示する最大投稿数 無制限
      $query->set( 'posts_per_page', -1 );
      
      // 検索文字列を更新
      $s = $query->get( 's' );
      $s = onlyNumbers( $s );
      $query->set( 's', $s );
      
    }
  }
} );

最後に タイトルのみ 完全一致 の 検索結果 に します

//---------------------------------------------------------------------------
//  検索対象 タイトルのみ 完全一致
//---------------------------------------------------------------------------

add_filter( 'posts_search', function ( $search ) {
  
  // タイトルのみ
  $search = preg_replace( "/ OR \([^\(\.]+.post_content LIKE '%.+%'\)/u", "", $search );
  
  // ワイルドカード除去
  $search = str_replace( '%', '', $search );
  
  return $search;
} );

これで 検索結果 を 検索対象を 投稿 かつ 数字のみ かつ タイトルのみ かつ 完全一致 に できました!!


WordPress Codex 日本語版 さんの 記事を 参考にさせていただきました
http://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7/pre_get_posts#.E6.A4.9C.E7.B4.A2.E7.B5.90.E6.9E.9C.E3.81.8B.E3.82.89.E5.9B.BA.E5.AE.9A.E3.83.9A.E3.83.BC.E3.82.B8.E3.82.92.E9.99.A4.E5.A4.96
WordPress私的マニュアル さんの 記事を 参考にさせていただきました
http://elearn.jp/wpman/column/c20140403_01.html

自作 テーマ を テーマユニットテスト で 検査してみた

詳細へ »

ビジュアルエディタ の エディタスタイル を 使ってみる

詳細へ »