我一直在搜索网络并且在我的大脑中喋喋不休几周但是无济于事。
我在WordPress(v3.4)上有一个产品数据库,我正在尝试使用URL查询进行搜索。
理想情况下,这就是我想要的场景:
post_type被称为“产品”,我目前有一个名为products的页面,其中分配了一个页面模板。但是,每当我尝试使用WordPress URL时,查询都会将我重定向到类似的URL新闻帖子(例如domain / 2011/10/01 / products-are-cool)。
如何创建这些过滤器并让它们正确显示结果?
更新:我想出了一个适合我的解决方案。
if(isset($_GET)) $options = $_GET;
if (!empty($options)) {
$posts = new WP_Query( array(
'post_type' => 'product',
'orderby' => 'title',
'order' => 'asc',
'paged' => $paged,
'tax1' => $options['tax1'],
'tax2' => $options['tax2'],
));
然后使用add_query_arg($termslug,$term->slug)
将分类法附加到网址上。
答案 0 :(得分:1)
您有一些冲突的URI结构规则。您可以向htaccess添加一行以解决此特定页面的问题。将它放在WordPress生成的规则之前但放在RewriteEngine On
子句之后。
RewriteRule /products /?page=33 [L,QSA]
显然 33 是页面ID。 [L]指令意味着这是要执行的最后一次重写,应该直接转到新的URI。 [QSA]应将products?had=here
的任何查询附加到新URI ?page=33&had=here
。
我会指出Redirect
和Rewrite
:
http-request get /products?tax=tax1
=> http-response 301 (moved permanently to:) /?page=33&tax=tax1
=> http-request get /?page=33&tax=tax1
重定向由搜索爬虫编制索引;
重写不会向您发送回复,提到您的URI已被重写;
基本上我建议的解决方案向访问者/浏览器显示/products?tax=tax1
地址,同时向WordPress显示重写的地址/?page=33&tax=tax1
。
在其他WordPress重写之前在.htaccess
中执行此操作并使用[L]停止执行任何后续重写,可以避免WordPress的内部机制分析的URI。
WordPress的内部机制会试图找出URI所指向的类别/页面/帖子。但是你的URI方案并不是最优的(如果你有类别和页面同名,WordPress会选择其中一个不一定是正确的。)
以下函数需要放在模板代码的functions.php中。或者在插件中。
function custom_search_query( $request ) {
$query = new WP_Query(); // the query isn't run if we don't pass any query vars
$query->parse_query($request);
$request['post_type'] = 'product';
// this is the actual manipulation; do whatever you need here
if(isset($_GET))
$options = $_GET;
if (!empty($options)) {
$i = 0;
$request['tax_query'] = array(); // resetting any previously selected meta_queries that might "linger" and cause weird behaviour.
// CAREFUL HERE ^ might not be desired behaviour
foreach($options AS $key => $value) {
$request['tax_query'][$i]['taxonomy'] = $key;
$request['tax_query'][$i]['terms'] = array($value);
$request['tax_query'][$i]['operator'] = 'IN';
$i++;
}
}
return($request);
}
add_filter( 'request', 'custom_search_query' );
它没有对用户输入进行验证,(wordpress可能会做一些但是如果你这样做会更好)。