WordPress自定义帖子URL查询

时间:2012-06-30 14:03:04

标签: php wordpress

我一直在搜索网络并且在我的大脑中喋喋不休几周但是无济于事。

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

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

  • 域/产品 - 显示所有产品
  • 域/产品?tax1 = term1 - 按分类过滤产品
  • 域/产品?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)将分类法附加到网址上。

1 个答案:

答案 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

我会指出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

在其他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可能会做一些但是如果你这样做会更好)。