WordPressの標準検索で(キーワードに加え)条件を追加して検索するサンプルです。
今回はカテゴリーと公開からの経過時間(1ヶ月以内や1年以内など)を反映した結果をsearch.phpへ表示する例を記載しています。
検索フォームはget_search_formで表示できますが今回は条件を追加するために変更します。
下記はカテゴリーと期間を追加するサンプルです。
<form role="search" method="get" id="searchform" class="searchform" action="<?php echo home_url('/'); ?>">
<input type="text" value="<?php get_search_query(); ?>" name="s" id="s">
<input type="submit" id="searchsubmit" value="Search">
<?php
$args = [
'show_option_none' => __( 'カテゴリ指定なし' ),
'show_count' => 1,
'orderby' => 'name',
'echo' => 1,
];
?>
<?php wp_dropdown_categories( $args ); ?> // 条件にカテゴリ追加を追加 クエリ文字はcatです。
<select name="period" id="period"> // 条件に期間を追加 クエリ文字を今回はperiodにしています。
<option value="-1">期間指定なし</option>
<option value="7 day ago">1週間以内</option>
<option value="1 month ago">1ヶ月以内</option>
<option value="3 month ago">3ヶ月以内</option>
<option value="6 month ago">6ヶ月以内</option>
<option value="1 years ago">1年以内</option>
</select>
</form>
pre_get_postsフックでsearch.phpのメインクエリをカテゴリーと期間を含むよう変更します。
functions.phpへ下記を追加します。
// functions.php
function set_search_query( $query ) {
if ( is_search() ) {
$s = get_query_var('s', '');
$cat = get_query_var( 'cat', false );
$cat = ( ctype_digit( $cat ) ) ? $cat : false;
$period = get_query_var( 'period', false );
$periods = [ '7 day ago', '1 month ago', '3 month ago', '6 month ago', '1 years ago' ];
$date_query = false;
if ( ! empty( $period ) && in_array( $period, $periods ) ) {
$date_query = [
[
'column' => 'post_date_gmt',
'after' => $period,
],
];
}
$query->set('s', $s);
if ( $cat !== false ) {
$query->set( 'cat', $cat );
}
if ( $date_query !== false ) {
$query->set( 'date_query', $date_query );
}
$query->set( 'posts_per_page', 20 );
}
}
add_action( 'pre_get_posts', 'set_search_query' );
合わせて期間用のクエリ文字periodをget_query_varで取得できるようにします。
catはパブリック・クエリ変数なので追加処理は必要ありません。
get_query_var() は WP_Query で認識されている「パブリック・クエリ変数」のみを取得します。言い換えれば、独自のクエリ変数でカスタム URL を作成したのみで追加処理(以下参照)を伴わない場合 get_query_var() はそういったクエリ変数を取得できません。
// functions.php
function my_query_vars( $vars ) {
$array = array( 'period' );
return array_merge( $array, $vars );
}
add_filter( 'query_vars', 'my_query_vars' );
search.phpで投稿を表示します。
ページネイトをつけるためget_postsのパラメーターへpagedを追加しています。
<?php
$args = [ 'paged' => $paged ];
$latest = get_posts($args);
if (!empty($latest)) {
foreach ( $latest as $post ) {
setup_postdata( $post );
?>
<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
<div class="excerpt">
<?php the_excerpt(); ?>
</div>
<?php }
} else {
echo '<p>お探しのキーワードは、本サイト内にはありませんでした。</p>';
}
?>
<div class="paginate">
<?php
/*
* ページナビ テーブル型
* http://www.yuriko.net/arc/2008/07/26/navigation/
*/
global $wp_rewrite;
$paginate_format = '';
$paginate_base = add_query_arg( [ 'paged' => '%#%' ] );
echo paginate_links( array(
'base' => $paginate_base,
'format' => $paginate_format,
'total' => $wp_query->max_num_pages,
'mid_size' => 5,
'current' => ( $paged ? $paged : 1 ),
) );
?>
</div>
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。