我有一个页面示例(ID=443,slug=示例),通过Dashboard->Settings->Reading
, 作为我的WP网站的主页。我还配置了以下重写规则:
[(example)/(view-section)] => index.php?pagename=$matches[1]&foo=1&bar=2
我在示例页面中有一个短代码,它应该根据
foo
和
bar
查询变量。问题是在访问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\');
有三种情况给了我不同的结果:
转到/示例/视图部分重定向到/且查询变量值为空转到/索引。php?pagename=示例(&N);foo=1(&;bar=2按我需要的方式工作。显示由短代码生成的内容和在URL中传递的两个查询变量的值如果我使用page_id
而不是pagename
或page
: /指数php?page\\u id=443(&U);foo=1(&;bar=2,则page_id
将删除查询变量,并再次显示默认主页我想知道WP为什么会出现上述行为,如果可能的话,如何使第一种情况至少与第二种情况类似。
请注意,如果示例页面未配置为主页,则案例1和3与案例2相同。
感谢您的帮助,如有必要,我很乐意提供更多细节。
EDIT
该问题最初包括指向正在运行的WP实例的链接以及该问题的一个示例。然而,我不能让那个实例永远运行下去,所以我删除了链接,并试图用文字来解释情况。
最合适的回答,由SO网友:Stephen Harris 整理而成
这个问题与重写规则无关(尽管我建议使用add_rewrite_rule()
而不是直接改变重写数组的低级方法。同样适用于flush_rewrite_rules()
. 此外,尽管规则只刷新一次,但最好在激活插件时执行,而不是在每次页面加载时检查的条件内执行。
。。。所以“问题”实际上是canonicalisation. 基本上,不同的URL可以指向相同的内容(包括仅带有额外正斜杠的URL)。我们的想法是
从seo角度来看,这是不好的-如果搜索引擎没有意识到所有这些url代表相同的资源,它们可能最终会相互竞争,从用户角度来看,这是不好的。如果他们去www.example。com?year=2012将其重定向到www.example。com/2012-更漂亮,更容易记忆因此,当WordPress收到“坏的”或“重复的”url时,例如www.example。com?year=2012它将其重定向到正确的(或“规范的”)url。(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.