定义重写规则后$ _GET为空

时间:2013-08-14 14:14:13

标签: wordpress

Hello Wordpress ninjas,

我是wordpress develpoment的新手。我定义了重写规则(带标记),类似于示例herehere中的内容。

$wp_rewrite->add_rewrite_tag('%filterx_location%', '([^&/]+)', 'filterx_location=');
$wp_rewrite->add_rule('property-location/(.+)$','index.php?post_type=property&filterx_location=$matches[1]', 'top');

现在,问题是,当查询完成(显示页面)时,未设置filterx_location参数。事实上,var_dump($_GET)给了我一个array(0) { }

我有一个黑色的东西,看起来像我在这里想念的简单,只是想不出来: - /

非常感谢任何帮助!

更新

更奇怪的是,当我用:

生成重写规则时
$wp_rewrite->add_rewrite_tag('%filterx_location%', '([^/]+)', 'filterx_location=');
$permalink_prefix = 'property-location'; 
$permalink_structure = '%filterx_location%/'; 
$rewrite_rules = $wp_rewrite->generate_rewrite_rules($permalink_prefix.'/'.$permalink_structure, EP_ALL, true, true, true, true, true);

如果我打印它们,我会看到一堆生成的网址匹配和重定向。其中之一是:

property-location/([^/]+)/page/?([0-9]{1,})/?$ => index.php?filterx_location=$matches[1]&paged=$matches[2]&post_type=property

我添加了所有生成的网址:

foreach($rewrite_rules as $regex => $redirect) {
    if(strpos($redirect, 'attachment=') === false) {
        //add the post_type to the rewrite rule
        $redirect .= '&post_type=property';
    }

    //turn all of the $1, $2,... variables in the matching regex into $matches[] form
    if(0 < preg_match_all('@\$([0-9])@', $redirect, $matches)) {
        for($i = 0; $i < count($matches[0]); $i++) {
            $redirect = str_replace($matches[0][$i], '$matches['.$matches[1][$i].']', $redirect);
        }
    }
    //add the rewrite rule to wp_rewrite
    $wp_rewrite->add_rule($regex, $redirect, 'top');
}

如果我转到网址/property-location/madrid/page/2/,那么query_vars正确地确实有[“paged”] =&gt; INT(2)。 但是filterx_location完全被忽略了!

1 个答案:

答案 0 :(得分:0)

好的,我在一个奇怪的事件中让它发挥作用。首先我替换了

$wp_rewrite->add_rewrite_tag('%filterx_location%', '([^/]+)', 'filterx_location=');

使用:

add_rewrite_tag('%filterx_location%', '([^/]+)', 'filterx_location=');

我注意到这是两件不同的事情。我看了一下add_rewrite_tag的wordpress代码:

function add_rewrite_tag($tagname, $regex) {
    //validation
    if ( strlen($tagname) < 3 || $tagname[0] != '%' || $tagname[strlen($tagname)-1] != '%' )
        return;

    $qv = trim($tagname, '%');
    global $wp_rewrite, $wp;
    $wp->add_query_var($qv);
    $wp_rewrite->add_rewrite_tag($tagname, $regex, $qv . '=');
}

我认为“add_query_var”部分可能是必不可少的。

但它仍无效!

所以我最后做的是在add_query_var()电话后添加另一个电话add_rewrite_tag()

add_rewrite_tag('%filterx_location%', '([^/]+)', 'filterx_location=');
$wp->add_query_var('filterx_location');

然后一切都开始起作用了。最初我假设$_GET应该保留我的变量,但是甚至对get_query_var('filterx_location')的调用都是空的。现在它得到了正确的东西。