WordPressで検索結果から固定ページを除外する方法について解説します。
functions.phpに記述するコード
function my_posts_search($search, $wp_query) {
if ($wp_query->is_search() && $wp_query->is_main_query() && !is_admin()) {
$search .= " AND post_type = 'post' ";
}
return $search;
}
add_filter('posts_search', 'my_posts_search', 10, 2);
posts_searchフィルターフックについて
posts_search
はWordPressの検索クエリのSQL WHERE句をカスタマイズするためのフィルターフックです。このフィルターを利用することで、デフォルトの検索機能を拡張し、特定の条件に基づいて検索結果を絞り込むことが可能になります。
posts_search
フィルターフックは、2つの引数を受け取ります。これらの引数はフックの仕様に基づいて定めれており、以下の役割を持ちます。
1. 第一引数$search
(検索クエリの SQL WHERE 句)
-
$searchは、WordPressが生成するデフォルトの検索クエリのSQL WHERE句を含む文字列です。これは、ユーザーがサイト内検索バーに入力したキーワードに基づいて自動生成されます。通常、この文字列は投稿のタイトルや内容にユーザーの検索キーワードが含まれるかどうかをチェックする条件が設定されています。
※この文字列に追加のSQL条件を組み込むことで、例えば特定のカテゴリやタグに属する投稿のみを検索結果に含めるといったカスタマイズが可能です。
2. 第二引数$wp_query
(WP_Queryオブジェクト)
-
$wp_queryは、現在実行中のクエリ状況を管理するWP_Queryクラスのインスタンスです。このオブジェクトには、クエリがどのようなページ(例えば、フロントページ、アーカイブページなど)で実行されているか、またはクエリがメインクエリであるかサブクエリであるかといった情報が含まれています。
※このWP_Queryオブジェクトを利用して、クエリが実行される特定の条件に基づいてフィルタの適用を制限したり、特定の条件下でのみカスタマイズを行うように設定することが可能です。
関数の定義
function my_posts_search($search, $wp_query) {
posts_serch
フィルターフックの仕様に基づいて、第一引数に$search
、第二引数に$wp_query
を定義しています。
検索クエリの条件的なカスタマイズ
if ($wp_query->is_search() && $wp_query->is_main_query() && !is_admin()) {
$wp_query->is_search()
: ここでは、現在実行中のクエリが検索結果ページのクエリかどうかを確認します。つまり、ユーザーが検索バーに何かを入力して検索ボタンを押した結果に基づくページが表示されているかを判定します。
$wp_query->is_main_query()
: ここでは、現在のクエリがメインのクエリであるかをチェックします。
!is_admin()
: この条件は、現在のページがWordPressの管理画面ではないことを確認します。管理画面では検索クエリのカスタマイズが必要ないため、このチェックを行い、フロントエンドの検索機能にのみ影響を与えるようにしています。
これらの条件を組み合わせることで、フロントエンドのメイン検索クエリにのみ影響を与えるようにします。
WordPressのデータベースクエリに条件を追加
$search .= " AND post_type = 'post' ";
この行のコードは、PHPにおける文字列の連結を利用して、既存の$search
変数に新たな条件を追加しています。
1. $search
変数:この変数には、my_posts_search
関数が呼び出された時点でのWordPressのSQL WHERE句が含まれています。具体的には、ユーザーが検索フォームに入力してキーワードに基づいて自動的に生成されたSQL文が格納されています。
※例えば、ユーザーが検索ボックスに「apple」と入力した場合、WordPressは通常、以下のようなSQL WHERE句を自動生成します。
WHERE post_title LIKE '%apple%' OR post_content LIKE '%apple%'
2. .=
演算子: これは「連結代入演算子」と呼ばれ、左側の変数(この場合は$search
)に右側の文字列を追加(連結)します。この操作により、$search
変数の既存の内容に新たな文字列が加わります。
3. " AND post_type = 'post' "
: この部分は、追加される新たな条件を表します。ANDはSQLにおいて複数の条件を組み合わせるために使用されるキーワードです。このように記述することで、検索結果を「投稿(post)」タイプのみに限定します。
add_filter 関数
add_filter('posts_search', 'my_posts_search', 10, 2);
add_filter
はWordPressが提供する関数の一つで、特定のフィルターフックに対して、カスタム関数(コールバック関数)を登録します。(上記では、posts_search
フィルターフックにmy_posts_search
関数を登録しています)この関数を使うことで、WordPressの標準的な動作に介入し、拡張や変更を加えることが可能になります。
add_filterの基本的な構文内容
add_filter( $tag, $function_to_add, $priority, $accepted_args );
- $tag : フィルターフックの名前です。これは、関数が結び付けられるフックを指定します。
- $function_to_add : フックに結びつける関数の名前です。この関数がフックが実行されたときに呼び出されます。
- $priority : 関数が実行される優先順位を指定します。数字が小さいほど先に実行されます。デフォルトは10。
- $accepted_args : 関数が受け取る引数の数です。デフォルトは1。
最後に
このように、posts_search
フィルターフックを利用して、検索結果から固定ページを除外し、投稿タイプが「投稿(post)」のものだけを表示するようにカスタマイズします。