我正在使用自定义页面模板,该模板旨在使用wpdb类和数据库中的一些外部表创建动态内容。我试图保持url的结构尽可能干净,因此我在永久链接中使用'post name'选项..
我只是给出了整个流程,所以不会让人困惑。
问题在于mod_rewrite - 因为我在wp的永久链接中使用了post_name选项 - wordpress本身试图在'dynamic'的父级下访问名为'347'的实际页面,而不是渲染动态模板并使用347作为一个参数,通过'爆炸'网址并检索最后一个值作为动态参数,如下所示 -
$str = "$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$dynamic_para = explode("/", $str, 4); // in this case - 347
//... retrieve dynamic_para from db and stuff with it.
如何专门为此页面绕过wp的当前mod_rewrite?它甚至可能吗?我试图避免使用url发送GET变量,例如www.domain.com/dynamic/?para=347
想要/ dynamic / xxx会被重写为/ dynamic?para = xxx
在WP中你应该用querystring重写index.php(用户在浏览器地址栏中仍然看到“/ dynamic / xxx”)
你在哪里放置了tc_query_vars_filter和tc_rewrite_rules($ rules)函数
您可以将它们放在(子)主题的functions.php中,或者更好地创建它们添加到您自己的简单插件中,以便它们可以使用任何主题:
例如创建,上传和激活:
<?php
/*
Plugin Name: Theme independent functions
Description: NOT TESTED
*/
// allow WP to store querystring attribs for use in our pages
function your_query_vars_filter($vars) {
$vars[] = 'para';
return $vars;
}
add_filter( 'query_vars', 'your_query_vars_filter' );
// "rewrite" /dynamic/xxx to index.php?pagename=dynamic¶=xxx
function your_rewrite_rules($rules) {
global $wp_rewrite;
$your_rule = array( // (not tested)
'dynamic/(.+)/?' => 'index.php?pagename=dynamic¶=$matches[1]'
);
return array_merge($your_rule, $rules);
}
add_filter('page_rewrite_rules', 'your_rewrite_rules');
// any other site customisation stuff you want to add to this plugin
?>
注:上面的过滤器是针对Pages;对于POSTS,请使用post_rewrite_rules过滤器
然后在您的自定义页面模板中:
$my_search_var = get_query_var('para'); // sanitize as reqd
Wordpress“缓存”其重写规则,因此最后我们需要刷新它们,以便识别新的规则:
通常的建议是你只需点击管理仪表板固定链接页面上的“保存更改”按钮即可刷新(设置 - >永久链接)但是,(由于我网站上的怪癖或最新版本的WP的更改?)上次我这样做了,我实际上必须编辑永久链接,保存更改然后将其更改回应该是什么,并再次保存以应用我的重写函数规则。