重写规则是重定向的,而不是传递VAR

时间:2012-02-16 作者:Christopher Harden

我的函数中有以下代码。php文件。

<?php
add_action(\'init\', \'flush_rewrite_rules\');

function custom_add_rewrite_rules( $wp_rewrite ) {
    $new_rules = array( 
        \'insurance-leads-types/auto-insurance-leads/([^/\\.]+)/?$\' => \'index.php?pagename=auto-insurance-leads&state=\' . $wp_rewrite->preg_index(1),
        \'insurance-leads-types/home-insurance-leads/([^/\\.]+)/?$\' => \'index.php?pagename=home-insurance-leads&state=\' . $wp_rewrite->preg_index(1)
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action(\'generate_rewrite_rules\', \'custom_add_rewrite_rules\');

function add_query_vars( $query_vars ) {
  $query_vars[] = \'state\';
  return $query_vars;
}
add_filter( \'query_vars\', \'add_query_vars\' ); 
当我转到页面/insurance leads types/auto insurance leads/STATENAME/时,URL重定向到/insurance leads types/auto insurance leads/不带尾随STATENAME/并且变量不会传递给$query\\u vars。

我使用了Monkeyman的重写分析器,一切看起来都很好:

pagename:汽车保险销售线索

状态:(.[^/]+)

你知道为什么URL会重定向吗?

3 个回复
SO网友:chrisguitarguy

您可能应该使用内置rewrite api 函数,而不是使用generate_rewrite_rules 滤器重写regex时存在一些问题。你需要从胡萝卜开始^, 告诉WP从URL的开头开始匹配。

我真的不确定你想用([^/\\.]+). 任何不是斜杠或句号的东西?如果是这样的话,它可能不会像你期望的那样工作。有人可以进来insurance-leads-types/auto-insurance-leads/tx.state/ 它不会匹配,因为你的正则表达式不能解释点后面的东西。

这是一个工作版本,它将匹配最后一组中不是斜杠的任何内容。

<?php
add_action( \'init\', \'wpse42604_add_rewrite\' );
function wpse42604_add_rewrite()
{
    add_rewrite_rule(
        \'^insurance-leads-types/auto-insurance-leads/([^/]+)/?$\',
        \'index.php?pagename=auto-insurance-leads&state=$matches[1]\',
        \'top\'
    );
    add_rewrite_rule(
        \'^insurance-leads-types/home-insurance-leads/([^/]+)/?$\',
        \'index.php?pagename=home-insurance-leads&state=$matches[1]\',
        \'top\'
    );
}
所有代码as a plugin. 我写了一个很大的tutorial about the rewrite api 那值得一看。

编辑:而且,您可能会遇到一些不可预测的行为,就像您的代码一样,在加载一个页面时刷新重写规则

SO网友:sanchothefat

我会使用add_rewrite_endpoint() 作用

它负责添加查询变量,而且设置起来更加简单,而且您不需要担心页面段塞的变化等等。。。

代码是:

// in functions.php
add_action( \'init\', \'wpse42604_add_endpoints\' );
function wpse42604_add_endpoints() {
   add_rewrite_endpoint( \'state\', EP_PAGES );
}

// in template file eg. page.php   
if ( \'\' != get_query_var( \'state\' ) ) {
    // ... do stuff with the state query var
}
一个缺点(取决于您的看法)是您无法获得上面指定的确切URL,它们如下所示:

insurance-leads-types/auto-insurance-leads/state/tx/

但它是一个更加健壮和灵活的解决方案,而且URL仍然很好看,可读性也很好。

您看到的问题是,我以前遇到过一个WordPress处理重写规则的问题,在查看重写之前执行规范重定向。不幸的是,我已经有一段时间没有查过了,所以记不清具体细节,但redirect_canonical() wp中的函数包括/规范。php,这给我带来了类似的问题。

SO网友:Ján Janočko

我多次遇到类似的问题,在我的情况下,重定向是由redirect_canonical() 放置在中的函数wp-includes/canonical.php. 此函数尝试重定向到给定请求的基本(规范)URL,并考虑您的URL/insurance-leads-types/auto-insurance-leads/STATENAME/ 指向与相同的页面/insurance-leads-types/auto-insurance-leads/ 所以它重定向了它。

最快的修复方法是在使用特定查询变量时禁用规范重定向,如下所示:

add_filter(\'redirect_canonical\', function($redirect_url, $requested_url) {
    if ( get_query_var(\'state\') ) {
        return $requested_url;
    }
}, 10, 2);
当然,您可以使用此过滤器并添加不同的条件。我还建议检查redirect_canonical 函数代码以查看其工作的精确性。

结束

相关推荐