2012-06-30 36 views
1

我一直在网上搜索和敲打我的大脑数周,但无济于事。WordPress的自定义发布网址查询

我有一个关于WordPress的产品数据库(v3.4),我试图使它可以使用URL查询进行搜索。

理想情况下是这样的情景我想:

  • 域/产品 - 显示所有的产品
  • 域/产品tax1 =字词1的 - 由分类
  • 域名过滤产品?/products?tax1 = term1 & tax2 = term2 - 筛选我的多个
    分类法。

该post_type被称为'产品',我目前有一个页面称为产品与页面模板分配给它。但是,每当我尝试使用WordPress网址查询时,都会将我重定向到类似的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)将分类法追加到URL上。

+0

编写分类法查询需要帮助吗? –

+0

我了解如何在WordPress中使用查询以及所需的URL,但我不知道为什么它不起作用。 –

回答

1

你有一些矛盾的URI结构规则。你可以添加一行到htaccess来解决这个特定的页面。将它放在WordPress生成的规则之前,但在RewriteEngine On条款之后。

RewriteRule /products /?page=33 [L,QSA] 

凡明显是页ID。 [L]指令意味着这是要执行的最后一次重写,应该直接转到新的URI。 [QSA]应将任何查询products?had=here附加到新的URI ?page=33&had=here

我想指出RedirectRewrite之间的区别:

  • 重定向发送一个响应返回给你说你的URI已经被重定向出于某种原因(暂时/永久等。):
    • http-request get /products?tax=tax1 =>
    • http-response 301 (moved permanently to:) /?page=33&tax=tax1 =>
    • http-request get /?page=33&tax=tax1
  • 重定向是在浏览器的地址栏中可见;
  • 重定向由搜索爬虫编入索引;

  • 重写不会向您发送回应,说您的URI已被重写;

  • 重写在您网站的地址栏中不可见;
  • 重写在应用程序端(WordPress)的行为,就好像应用程序已收到重写的URI(WordPress不知道地址何时被重写);

基本上我提出的解决方案显示访问者/浏览器/products?tax=tax1地址,同时显示WordPress的重写地址/?page=33&tax=tax1

.htaccess之前其他WordPress的重写这样做发生,并使用[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可能会做一些,但如果你这样做会更好)。

+0

那么这实现了什么?我能否使用'/产品?tax1 = term1'? 它必须是'/?page = 34129?tax1 = term1'? –

+0

我会在答案中解释。 –

+0

谢谢你的解释:-) 但是,它似乎并没有奏效。它不再重定向到另一个(不正确)页面,但它也不会过滤结果。 –