TOKYOからOKINAWAに移住したHOMME

20代後半で思い立ったように東京から沖縄に移住したヤローの徒然+プログラム関連作業用メモ

作業用メモ:Wordpressの検索結果から固定ページを除外する

作業用メモ

 

固定ページを検索結果から除外したい

で、固定ページは検索結果から外したいと思いググる
下記のようなpre_get_postsでqueryを書き換えるやり方が多く出てきました。

<?php /* functions.php */

function SearchFilter($query) {
  if ($query->is_search) {
    $query->set('post_type', 'post');
  }
  return $query;
}
add_filter('pre_get_posts','SearchFilter');

しかし、上記の方法だと、
どのキーワードで検索してもpost_type="post"の記事が全て表示されてしまいました。。。

なので、比較的最近投稿された記事を探しました。
(wordpressの様な更新が多くノイズが検索にかかりやすい記事は投稿日はわかりやすく明記して欲しい!切実に!!)
ここでposts_searchフィルターを使う方法が書かれていましたので、
先ほど記述したSearchFilterを削除して下記をfunction.phpに記述しました。

<?php /* functions.php */
function my_posy_search($search) {
  if(is_search()) {
    $search .= " AND post_type = 'post'";
  }
  return $search;
}
add_filter('posts_search', 'my_posy_search');

これで、期待通り検索結果がpost_type="post"のものだけになりました!

カスタム投稿タイプを検索結果に含めたい

次に、カスタム投稿タイプnewsも検索に含めたいと思いました。

どうやらposts_searchの$searchはクエリーのWHERE文になるようなので、ここでpost_type = 'news'を追加すればうまく行きそうな気がします。

<?php /* functions.php */
function my_posy_search($search) {
  if(is_search()) {
    // post_type='news'も検索結果に含める
    $search .= " AND (post_type = 'post' OR post_type='news')";
  }
  return $search;
}
add_filter('posts_search', 'my_posy_search');

上記の様にWHERE文に追加しました。
しかし、検索結果にはpost_type = 'post'のものしか表示されませんでした。。。

一度function.phpに記述した絞り込みの処理をコメントアウトして検索結果を見てみたところ、どうやら元々のクエリにカスタム投稿タイプが含んでないっぽい!という事が解りました。
(カスタム投稿タイプは検索結果に出てこなかった)

なので、pre_get_postsアクションで検索時にpost_typeを追加してみました。

<?php /* function.php */
function my_posts_per_page($query) {
  if( is_search() ) {
    $query->set( 'post_type', array('post', 'news') );
  }
}
add_action( 'pre_get_posts', 'my_posts_per_page' );

function my_posy_search($search) {
  if(is_search()) {
    // post_type='news'も検索結果に含める
    $search .= " AND (post_type = 'post' OR post_type='news')";
  }
  return $search;
}
add_filter('posts_search', 'my_posy_search');

これで、再検索した結果...
期待通り postとnewsの中から検索結果が表示されました!

 

サイトにカスタム投稿のパーマリンクを変更するWordPress › Custom Post Type Permalinks « WordPress Plugins プラグインを使用していた事、投稿パーマリンク設定を変更していた事も影響あるかもしれませんが、上記の方法で期待する結果を実現することができました。

 

 


 

 

調べていた所、検索フォームにinputタグを記述してしまう方法もあるようです。
WordPress › Support » Limit Search Results to Custom Post Type?

<form method="get" action="<?php bloginfo( 'url' ); ?>">
  <input type="hidden" name="post_type[]" value="post">
  <input type="hidden" name="post_type[]" value="news">
  <input name="s" id="s" type="text" />
  <input id="submit" type="submit" value="検索" />
</form>

フォーラムを参考に検索ボックスにinput[type="hidden", name="post_type[]"]で検索に含めたいpost_typeをvalueにして記述しておけば検索結果にも表示させることができました。
やり方としてはこちらの方が簡単かもしれません。