我到处寻找解决方案,并尝试了不同的解决方案,包括Chip Bennett在这里详细解释的解决方案。但我似乎仍然无法使其发挥作用。
结果的第一页运行良好,但从第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页URL:
http://localhost/cunningham/?location=&propertytype=&minBedrooms=1&maxBedrooms=9&minCost=0&maxCost=100000&meta_key=&tenancy=&s=
第2页URL:
http://localhost/cunningham/page/2/?location&propertytype&minBedrooms=1&maxBedrooms=9&minCost=0&maxCost=100000&meta_key&tenancy&s/
您的主查询和辅助(自定义)查询之间存在冲突。
你做的事情一半错一半对:-)。让我们看看你正在做什么
-
代码的第一部分是更改主查询的正确方法。事实上,这就是让事情运转起来所需要的一切。虽然有一些缺陷
-
pre_get_posts
确实会更改所有查询,主要查询和次要查询都一样。这不仅仅发生在前端,后端也会受到影响。您只需要将更改应用于前端,并且只针对主查询function advanced_search_query($query) { if ( !is_admin() && $query->is_main_query() && $query->is_search() ) { //REST OF YOUR CODE
-
不需要在
pre_get_posts
中设置paged
参数。这是由主查询设置的,不需要更改,所以请删除它。 -
除此之外,它应该还可以正常工作。我无法测试你的代码,因为我没有与你的相同的设置
-
-
您不需要自定义(辅助)查询。您已经修改了主查询以处理您的更改
-
你的循环很好。这就是你在search.php模板中所需要的全部,没有其他
编辑
来自OP 的评论
我几乎认为某个地方存在永久链接问题。除了基本内容外,我的
.htaccess
中没有任何内容,我的永久链接结构是/%category%/%postname%/
,有了这个结构,分页在另一个有普通查询硬编码到php文件的页面上可以很好地工作。实际上,只有这个搜索页面有问题,这都是因为页面没有设置为URL
以及解决方案
我找到了解决办法。后面的斜线把搞砸了