规则包括主页插件时的重写规则问题

时间:2012-05-08 作者:Willington Vega

我有一个页面示例(ID=443,slug=示例),通过Dashboard->Settings->Reading, 作为我的WP网站的主页。我还配置了以下重写规则:

[(example)/(view-section)] => index.php?pagename=$matches[1]&foo=1&bar=2
我在示例页面中有一个短代码,它应该根据foobar查询变量。问题是在访问URL时没有正确设置查询变量/example/view-section (及其他相关内容,见下文)。

我正在使用一个测试插件来调试这个问题。完整代码如下:

<!-- language: lang-php -->
<?php

function test_shortcode() {
    global $wp_rewrite;

    echo \'<pre>\' . \'foo: \' . get_query_var(\'foo\') . \'</pre>\';
    echo \'<pre>\' . \'bar: \' . get_query_var(\'bar\') . \'</pre>\';
    echo \'<pre>\' . print_r($wp_rewrite->rules, true) . \'</pre>\';
}
add_shortcode(\'foobar\', \'test_shortcode\');

function test_rules() {
    $rules = get_option(\'rewrite_rules\');
    if (!isset($rules[\'(example)/(view-section)\'])) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}
add_action(\'wp_loaded\', \'test_rules\');


function test_rewrite_rules($wprules) {
    $rules = array(\'(example)/(view-section)\' => \'index.php?pagename=$matches[1]&foo=1&bar=2\');
    return $rules + $wprules;
}
add_action(\'rewrite_rules_array\', \'test_rewrite_rules\');


function test_query_vars($query_vars) {
    array_push($query_vars, \'foo\');
    array_push($query_vars, \'bar\');
    return $query_vars;
}
add_filter(\'query_vars\', \'test_query_vars\');
有三种情况给了我不同的结果:

转到/示例/视图部分重定向到/且查询变量值为空page_id 而不是pagenamepage: /指数php?page\\u id=443(&U);foo=1(&;bar=2,则page_id 将删除查询变量,并再次显示默认主页我想知道WP为什么会出现上述行为,如果可能的话,如何使第一种情况至少与第二种情况类似。

请注意,如果示例页面未配置为主页,则案例1和3与案例2相同。

感谢您的帮助,如有必要,我很乐意提供更多细节。

EDIT

该问题最初包括指向正在运行的WP实例的链接以及该问题的一个示例。然而,我不能让那个实例永远运行下去,所以我删除了链接,并试图用文字来解释情况。

1 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

这个问题与重写规则无关(尽管我建议使用add_rewrite_rule() 而不是直接改变重写数组的低级方法。同样适用于flush_rewrite_rules(). 此外,尽管规则只刷新一次,但最好在激活插件时执行,而不是在每次页面加载时检查的条件内执行。

。。。所以“问题”实际上是canonicalisation. 基本上,不同的URL可以指向相同的内容(包括仅带有额外正斜杠的URL)。我们的想法是

从seo角度来看,这是不好的-如果搜索引擎没有意识到所有这些url代表相同的资源,它们可能最终会相互竞争,从用户角度来看,这是不好的。如果他们去www.example。com?year=2012将其重定向到www.example。com/2012-更漂亮,更容易记忆

它执行的一项检查是我们是否在“主页”上,如果在,它会检查我们是否在使用主页的规范url:http://108.166.64.229/ 在你的情况下。如果没有,您将被重定向到此处。你会注意到的http://108.166.64.229/example 重定向到那里。

您可以关闭此功能。在上运行规范化template_redirect 钩因此,您可以简单地将其删除:

remove_filter(\'template_redirect\', \'redirect_canonical\');
或者,你可以通过使用一个在redirect_canonical 回调函数

add_filter(\'redirect_canonical\', \'wpse51530_redirect_canonical\', 10, 2);

function wpse51530_redirect_canonical($redirect_url, $requested_url){
    if( is_front_page() )
        return $requested_url;
    else
        return $redirect_url;
}
你可以看到WordPress是如何规范化的here.

结束

相关推荐

Wordpress global variables?

我有一个叫“某物”的metabox页面。它可以有两个值“value”和“value2”。我在这个页面上使用了一个短代码,希望它显示一些东西的值。问题是我不知道如何在短代码中访问全局变量?例如,我在第页有这个。php:if($something == \"value\") { global $one, $two; $one = 120; $two = 240; } 现在我想在shortocde(functions.php文件)中