WordPressの検索をカスタマイズ : WordPress

Pocket

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.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。