1

我已经在网上搜索了几个星期,脑子里嗡嗡作响,但无济于事。

我在 WordPress (v3.4) 上有一个产品数据库,我正在尝试使用 URL 查询使其可搜索。

理想情况下,这是我想要的场景:

  • 域/产品 - 显示所有产品
  • domain/products?tax1=term1 - 按分类过滤产品
  • domain/products?tax1=term1&tax2=term2 - 过滤我的多个
    分类法。

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)将分类法附加到 URL 上。

4

1 回答 1

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

  • 重定向会向您发送回复,说明您的 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 可能会做一些,但如果你这样做会更好)。

于 2012-06-30T14:15:08.093 回答