Wordpress:搜索结果分页仍无法正常工作

时间:2014-09-20 03:37:05

标签: php wordpress search pagination

我搜索过高低不同的解决方案并尝试了不同的解决方案,包括Chip Bennett彻底解释的here,但我似乎仍然无法使其正常工作。

结果的第一页工作正常,但是从第2页开始,它只显示索引模板,仍然说找不到页面。这是我的代码:

的functions.php

function advanced_search_query($query) {
    if ($query->is_search) {
        $query->set('s', $_GET['s']);
        $query->set('post_type', array( 'properties' ));
        $query->set('meta_key', $_GET['meta_key']);
        $query->set('orderby', $_GET['sortby']);
        $query->set('order', $_GET['order']);
        $query->set('posts_per_page', '5');
        $query->set('paged', $paged);

        if (isset($_GET['author'])) {
            $query->set('author', $_GET['author']);
        }

        if (isset($_GET['propertytype'])) {
            $query->set('taxonomy', 'propertytype');
            $query->set('terms', $_GET['propertytype']);
        }

        $minCost = $_GET['minCost'];
        $minCost = preg_replace("/[^0-9]/","", $minCost);
        if ($minCost == ""){
            $minCost = "0";
        }

        $maxCost = $_GET['maxCost'];
        $maxCost = preg_replace("/[^0-9]/","", $maxCost);
        if ($maxCost == ""){
            $maxCost = "99999999999999";
        }

        $query->set('meta_query', array(
            'relation' => 'AND',
            array(
                'key' => 'ce_location',
                'value' => $_GET['location'],
                'compare' => 'LIKE',
                'type' => 'CHAR'
            ),
            array(
                'key' => 'ce_cost',
                'value' => array($minCost, $maxCost),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC'
            ),
            array(
                'key' => 'ce_bedrooms',
                'value' => array($_GET['minBedrooms'], $_GET['maxBedrooms']),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC'
            ),
            array(
                'key' => 'ce_tenancy',
                'value' => $_GET['tenancy'],
                'compare' => 'LIKE',
                'type' => 'CHAR'
            )
        ));
    };
    return $query;
};
add_filter('pre_get_posts', 'advanced_search_query', 1000);

提取查询参数的代码

global $query_string;

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

foreach($query_args as $key => $string) {
    $query_split = explode("=", $string);
    $search_query[$query_split[0]] = urldecode($query_split[1]);
}
$search_query['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;

$search = new WP_Query($search_query);

循环代码:

if ( have_posts() ) :  while (have_posts()) : the_post();

    //loop content

endwhile;
    if(function_exists('wp_simple_pagination')) { wp_simple_pagination(); } ?>
else :
    echo 'Sorry, there are currently no property listings available';
endif;

任何建议都将受到极大的赞赏。

编辑:

我还注意到,当我尝试访问第2页时,URL被修改。

这是第1页网址:

http://localhost/cunningham/?location=&propertytype=&minBedrooms=1&maxBedrooms=9&minCost=0&maxCost=100000&meta_key=&tenancy=&s=

第2页网址:

http://localhost/cunningham/page/2/?location&propertytype&minBedrooms=1&maxBedrooms=9&minCost=0&maxCost=100000&meta_key&tenancy&s/

1 个答案:

答案 0 :(得分:4)

您的主查询与辅助(自定义)查询之间存在冲突。

你做的事情是错误的,一半是对的:-)。让我们来看看你在做什么

  1. 代码的第一部分是更改主查询的正确方法。这实际上就是让事情发挥作用所需要的一切。你有几个缺点,但

    • pre_get_posts确实会改变所有查询,主要和次要查询。这不仅仅发生在前端,后端也受到影响。您将需要仅对前端应用更改,并且仅针对主查询

      function advanced_search_query($query) {
          if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
      
             //REST OF YOUR CODE
      
    • 您无需在paged中设置pre_get_posts参数。这是由主查询设置的,不需要更改,因此请删除它。

    • 除此之外,它应该工作得很好。我无法测试您的代码,因为我没有与您的代码相同的设置

  2. 您不需要自定义(辅助)查询。您已修改主查询以处理更改

  3. 你的循环很好。这是您在search.php模板中所需要的全部内容,

  4. 修改

    来自OP的评论

      

    我几乎认为某处存在固定链接问题。除了基础知识之外,我的.htaccess中没有任何内容,我的固定链接结构是/%category%/%postname%/,并且该结构的分页在另一个具有正常查询硬编码到php文件中的页面上运行良好。实际上只有这个搜索页面存在问题而且全部都是因为分页没有被设置为URL

    解决方案

      

    好吧,我找到了解决方案。尾随斜线正在弄乱一切