サポート » 使い方全般 » 検索での404について

  • 「エリア」「ジャンル」「ワード」で検索し、ヒットした記事を1ページに10件並べて、まだ記事があれば次のページへ…というものを作成したいのですが、404が出ます。
    出るページ数は検索ワードで違っています。

    「エリア」「ジャンル」はカスタムフィールドのセレクトボックスで作成しており、同じであれば表示です。
    「ワード」は、カスタムフィールド「内容」「全文」のどれかで文字があれば表示です。
    ページネーションはプラグイン「WP-PageNavi」を使用しています。

    以下、search.phpの内容です。

    $area = $_GET[‘area’]; // 検索エリア
    $genre = $_GET[‘genre’]; //検索ジャンル
    $searchtext = htmlspecialchars($_GET[‘s’], ENT_QUOTES, ‘UTF-8’); //検索ワード

    $paged = get_query_var(‘paged’)? get_query_var(‘paged’) : 1;
    $args = array(
    ‘post_type’ => ‘post-t’,
    ‘posts_per_page’ => 10,
    ‘paged’ => $paged,
    ‘post_parent’ => 0,
    ‘post_status’ => “publish”,
    ‘meta_query’ => array(
    ‘relation’=>’AND’,
    array(
    ‘key’=>’エリア’,
    ‘value’=>$area[0],
    ‘compare’=>’LIKE’
    ),
    array(
    ‘key’=>’ジャンル’,
    ‘value’=>$genre[0],
    ‘compare’=>’LIKE’
    ),
    array(
    ‘relation’=>’OR’,
    array(
    ‘key’=>’内容’,
    ‘value’=>$searchtext,
    ‘compare’=>’LIKE’
    ),
    array(
    ‘key’ => ‘全文’,
    ‘value’=>$searchtext,
    ‘compare’=>’LIKE’
    ),
    ),
    ),
    );

    // クエリの定義
    $the_query = new WP_Query( $args );
    ?>
    <?php // ループ
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) :
    $the_query->the_post(); ?>
    ———繰り返す部分———
    <?php endwhile; ?>
    <?php // ページナビ ?>
    <div class=”pagenavi-area”>
    <?php
    if(function_exists(‘wp_pagenavi’)) {
    wp_pagenavi(
    array(
    ‘query’=>$the_query,
    ‘options’ => array(
    ‘num_pages’ => 4
    )
    )
    );
    }
    wp_reset_postdata();
    ?>
    </div>
    <?php wp_reset_query();endif; ?>

    自分なりに調べたところ、全ページの取得が上手くいっていないようなのですがどこをどう改善していいのか分からずにいます。

    ご教授いただければ幸いです。
    足りない情報がありましたら追加いたします。

    よろしくお願いいたします。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • こんにちは

    WP_Query を使っているが、標準の検索クエリ(メインクエリ)を使おうとしているため、検索結果数が一致しないためだと思います。
    pre_get_posts フックなどでメインクエリの条件を変更するようにしてみてはと思います。

    現状のコードのままで、404 を回避するには、ちょっと無理矢理感半端ないですが、メインクエリの検索結果を投稿数(検索結果以上になるように)に変更してみてはと思います。

    function my_pre_get_posts($query) {
    	if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
    		$query->set( 's', '' );
    		$query->set( 'post_type', '投稿タイプ' );
    		$query->set( 'posts_per_page', 1 );
    	}
    }
    add_action( 'pre_get_posts','my_pre_get_posts' );
1件の返信を表示中 - 1 - 1件目 (全1件中)
  • このトピックに返信するにはログインが必要です。