web-dev-qa-db-ja.com

カスタム検索ページのページ区切りが機能しない

マイサーチページのURL:

https://www.example.com/search/keyword/page/2/

これが私のカスタム検索ページです。

<?php 

    if($_GET['search_text'] && !empty($_GET['search_text']))
    {
        $text = $_GET['search_text'];
    }
    else
    {
        $text = urldecode( get_query_var('search_text') ) ;            
    }

?>

<div id="primary" class="content-area">
    <main id="main" class="site-main" role="main">            
        <div class="searchpage-container">
            <div class="searchpage-filter-container">
                <span>Arama Sonuçları:</span>
            </div>                
            <div class="product-container">
                <?php
                    $my_products = array( 2085, 4094, 2900, 4072, 131 );

                    global $paged;
                    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;

                    $args = array(
                        'post_type' => 'product',
                        'posts_per_page' => 2,
                        'paged' => $paged,
                        'post__in' => $my_products

                    );
                    $loop = new WP_Query( $args );

                    if ( $loop->have_posts() ) {
                        while ( $loop->have_posts() ) : $loop->the_post();
                            wc_get_template_part( 'content', 'product' );
                        endwhile;

                        $total_pages = $loop->max_num_pages;

                        if ($total_pages > 1){

                            /* $current_page = max(1, get_query_var('paged')); */
                            $wp_query->query_vars['paged'] > 1 ? $current_page = $wp_query->query_vars['paged'] : $current_page = 1;   
                            echo $wp_query->query_vars['paged'];

                            echo paginate_links(array(
                                'base' => get_pagenum_link(1) . '%_%',
                                'format' => '/page/%#%',
                                'current' => $current_page,
                                'total' => $total_pages,
                                'prev_text'    => __('« prev'),
                                'next_text'    => __('next »'),
                            ));
                        }
                    } 
                    wp_reset_postdata();                    

                ?>  
            </div>            
        </div>


    </main><!-- #main -->
</div><!-- #primary -->

私のページネーションリンクはうまく作成されています、しかしquery_vars['paged']がどういうわけか空っぽであるので、私は常にページNo 1を見ます。

このページPreserving Search Page Results and Paginationセクションを見ましたが、使い方を理解することができませんでしたが、私の場合はこれが本当に必要だとは思いません。

編集1(J.D.からのコメントへの応答):

あなたが言及したその関数はプロダクトIDの配列を返すだけです、私のコードを単純化するために、私は代わりに静的配列を追加する私の関数を削除しました。

3
HOY

代替クエリと、裏側で実行されている既定の検索クエリとの間で競合が発生しています。

新しいWP_Queryを実行する代わりに、pre_get_postsにフックしてデフォルトのクエリを変更してみてください。

function wpse276396_search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $text = urldecode( get_query_var('search_text') );
      $my_products = aws_search_byozan($text);
      $query->set('post_type', 'product');
      $query->set('posts_per_page', 2);
      $query->set('post__in', $my_products);
    }
  }
}

add_action('pre_get_posts','wpse276396_search_filter');

次に、カスタムのWP_Query Loopではなく、テンプレートのデフォルトのLoopを出力します。

これには、デフォルトのクエリでデータベースを一度ヒットせずに結果を無視し、代わりにカスタムクエリを使用してページをレンダリングするという利点があり、さらにpagedおよびposts_per_page引数は WP に一致します。

編集:これがページテンプレートにあることをどうにか見逃していた。 今日はこれで十分なWPSEですが、デフォルトの検索クエリを変更するのではなく、それを反映するように回答を更新します(組み込みの検索フォームと共存させるためにカスタム検索が必要な場合を除く) 。

この場合、起こっていることは WP あなたの検索ページをフェッチしたメインクエリに適用するためにpagedposts_per_page引数が期待されていることです。

$my_products = aws_search_byozan($text);
global $query_string;

$query_args = explode("&", $query_string);
$search_query = array();

if( strlen($query_string) > 0 ) {
    foreach($query_args as $key => $string) {
        $query_split = explode("=", $string);
        $search_query[$query_split[0]] = urldecode($query_split[1]);
    } // foreach
} //if

global $paged;
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;

$args = array(
    'post_type' => 'product',
    'posts_per_page' => 2,
    'paged' => $paged,
    'post__in' => $my_products

);
$loop = new WP_Query( array_merge($search_query, $args ) );
0
Chris Cox

この問題では、最初に次のようなページ付け関数を使います。

 function cupagenavi(){
グローバル$ wp_query、$ wp_rewrite; 
 $ pages = ''; 
 $ max = $ wp_query-> max_num_pages; 
 if(! $ current = get_query_var( 'paged'))$ current = 1; 
 $ a ['base'] =($ wp_rewrite-> using_permalinks())? user_trailingslashit(trailingslashit(remove_query_arg( 'page'、get_pagenum_link(1)))。 '?page =%#%'、 'page'):@add_query_arg( 'page'、 '%#%'); 
 if(!empty($ wp_query-> query_vars ['s']))$ a ['add_args'] =配列( 's' => get_query_var( 's')); 
 $ a ['total '] = $ max; 
 $ a [' current '] = $ current; 
 $ total = 1; 
 $ a [' mid_size '] = 4; [.____ $ a ['end_size'] = 4; 
 $ a ['prev_text'] = '前のページ'; 
 $ a ['next_text'] = '次のページ'; 
 if($ max> 1)echo ''; 
 $ pagesをエコーし​​ます。 paginate_links($ a); 
 if($ max> 1)echo ''; 
}

この関数を使うためにこのコードを使う

 if(function_exists( 'cupagenavi'))cupagenavi(); 

そして、クエリ投稿で次のように使用します。

 $ paged = $ _GET ['page']; 
 $ args = array(
 'post_type' => 'product'、
 'posts_per_page' => '2'、
 'paged' => $ paged、
); 
 query_posts($ args); 
1
Sajjad Sky

どの「ページ付き」変数を参照しているのかは、明確ではありません。それは、さまざまな場所にあるからです。

実際には、$wp_query->get..の代わりに、$ loopまたは$ GLOBALS ['wp_query']を試してください。

//携帯から送信されました。

1
T.Todua