自定义搜索页面分页不起作用

时间:2017-08-09 作者:HOY

我的搜索页面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\'] 是emtpy。

我看到了Preserving Search Page Results and Pagination 上的节this page , 但我不知道该如何使用它,但我认为在我的情况下真的不需要这样做。

EDIT 1 (Response to comment from J.D.):

您提到的那个函数只返回一个产品ID数组,为了简化代码,我删除了我的函数,改为添加一个静态数组。

3 个回复
最合适的回答,由SO网友:Chris Cox 整理而成

您的替换查询与后台运行的默认搜索查询之间发生冲突。

不要运行新的WP\\u查询,请尝试通过挂接到pre\\u get\\u帖子来修改默认查询:

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\\U查询循环。

这样做的好处是,默认查询不会命中数据库一次,然后忽略结果,而是使用自定义查询来呈现页面,再加上pagedposts_per_page 参数与WP的预期一致。

Edit: I somehow managed to miss that this is in a page template. 对于我来说,今天的WPSE已经足够了,但我将更新我的答案以反映这一点,而不是修改默认搜索查询(这仍然是一个更好的选项,除非您需要自定义搜索与内置搜索表单共存)。

在这种情况下,WP期望pagedposts_per_page 要应用于获取搜索页面的主查询的参数,这意味着您链接的Codex页面上的说明绝对适用。

$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 ) );

SO网友:Sajjad Sky

对于此问题,首先使用如下分页函数:

 function cupagenavi() {
global $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\'] = array( \'s\' => get_query_var( \'s\' ) );
$a[\'total\'] = $max;
$a[\'current\'] = $current;
$total = 1;
$a[\'mid_size\'] = 4;
$a[\'end_size\'] = 4;
$a[\'prev_text\'] = \'Previous Page\';
$a[\'next_text\'] = \'Next Page\';
if ($max > 1) echo \'\';
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);

SO网友:T.Todua

还不完全清楚您引用的是哪个“paged”变量,因为它位于不同的位置。

实际上,而不是$wp_query->get.. 您应该尝试$loop或$GLOBALS[\'wp\\u query\']

//从手机发送,抱歉语法错误

结束

相关推荐

Custom Category Archive Pages

我有一个带有6个类别的WP安装,我希望其中3个使用名为“Category special.php”的自定义类别归档页面(默认页面是“Category.php”)。我发现下面的代码看起来很接近我的查询,我如何修改它并使其适合我,所以类别31、40和55可以加载上面的特定页面?add_filter( \'template_include\', \'wpsites_photo_page_template\', 99 ); function wpsites_photo_page_template( $te