WordPressの検索窓をカスタマイズする機会がありましたので備忘録として残しておきます。
Contents
検索窓を作るにあたり必要なファイル
ワードプレスで検索窓を作るにあたり必要なファイルは主に以下の二つです。
- searchform.php
- search.php
searchform.php
検索窓のスタイル等はsearchform.phpに記述します。
searchform.phpに記載するコードはheader.phpに直接しても問題ありませんが、テンプレートファイルにしておくと色々なページで使いまわすことができるので後々便利です。
<form method="get" id="searchform" action="<?php bloginfo('url'); ?>">
<input type="text" name="s" id="s" placeholder="キーワード検索"/>
<button type="submit">検索</button>
</form>
search.php
検索結果を表示するためのページはsearch.php に記述します。
<?php if (have_posts()) : ?>
<ul>
<?php while (have_posts() && get_search_query() ) : the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a>
</li>
<?php endwhile;?>
</ul>
<?php else : ?>
<p>検索結果がありません。</p>
<?php endif; ?>
作成したフォームを表示させる
任意のページに以下のコードを記述します。
<?php get_search_form(); ?>
検索結果をカスタマイズする
検索結果をカスタマイズするする場合pre_get_postsというワードプレスのアクションフックを使用すると便利です。
pre_get_postsはデータベースへの検索が行われるクエリ実行前(記事データの問い合わせ前)に呼び出され、functions.phpの中に書くことで実行されます。
function custom_pre_get_posts($query) {
// 管理画面またはメインクエリでは適用しない
if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'パラメータ', '値' );
}
};
add_action( 'pre_get_posts','custom_pre_get_posts' );
投稿タイプを指定してを絞り込む
投稿(post)と固定ページ(page)の他に、カスタム投稿(hoge)を検索対象にしたい場合は以下のように記述します。
function custom_pre_get_posts($query) {
// 管理画面またはメインクエリでは適用しない
if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', array('post','page','hoge') );
}
};
add_action( 'pre_get_posts','custom_pre_get_posts' );
検索結果から特定のページを除外する方法
array( 1,2,3 )の数字部分に任意の投稿IDを入力すると除外することができます。
function custom_pre_get_posts($query) {
// 管理画面またはメインクエリでは適用しない
if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post__not_in', array( 1,2,3 ) );
}
};
add_action( 'pre_get_posts','custom_pre_get_posts' );
検索結果から特定のカテゴリーを除外する方法
function custom_pre_get_posts($query) {
// 管理画面またはメインクエリでは適用しない
if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'category__not_in', array( 1,2,3 ) );
}
};
add_action( 'pre_get_posts','custom_pre_get_posts' );
検索結果から特定のタグを除外する方法
function custom_pre_get_posts($query) {
// 管理画面またはメインクエリでは適用しない
if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'tag__not_in', array( 1,2,3 ) );
}
};
add_action( 'pre_get_posts','custom_pre_get_posts' );
検索結果を5年以内の記事に限定する
日付パラメータのdata_queryを使用することで○年以内または、○○年以降という指定ができます。
function custom_pre_get_posts($query) {
// 管理画面またはメインクエリでは適用しない
if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'date_query',
[
[
'after' => '5 year ago', // 5年以内
// 'after' => '2022-01-10', // 2022年1月10日以降
// 'before' => '2022-01-10', // 2022年1月10日以前
]
]
);
}
};
add_action( 'pre_get_posts','custom_pre_get_posts' );