对于带有查询参数和短代码的页面URL,我的重写规则有什么问题?

时间:2014-10-01 作者:Ray N. Franklin

我是WP编程新手,在其他环境中,我遇到了一个简单的问题。

我使用普通的WP管理UI创建了一个页面(cdl手册)。然后,我在主题函数中添加了一些函数。php文件,以便我可以对页面内容使用短代码。这些函数在URL上查找查询参数(jp\\u stn),并使用该信息从数据库表中选择内容。在这种情况下,参数值是美国州的名称。提供的内容是一个关注该状态的页面。

所有这些都在我的开发网站上运行。

http://blog.jobspetroleum.net/cdl-training/ 列出每个州的CDL手册链接。如上所述,这些链接的形式如下。

http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona

现在,我想将特定于状态的查询参数URL转换为用户友好的URL。这是新的模式。

http://blog.jobspetroleum.net/cdl-manual/arizona/

对我来说,显而易见的解决办法是添加一条重写规则。经过多次摸索,我找到了一个插件,可以让我将自定义重写规则直接添加到。htaccess文件。插件是“WP-htaccess-Control”,它工作得很好。然而,我的重写规则并没有发挥应有的作用。以下是结果。添加重写规则后的htaccess文件。

# BEGIN WordPress

# WPhtc: Begin Custom htaccess
RewriteRule ^cdl-manual/([-a-z]+)/$ /cdl-manual/?jp_stn=$1 [L]
# WPhtc: End Custom htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
新规则位于自定义htaccess部分。当我用/cdl-manual/arizona/测试它时,它会产生404错误。为了调试,我尝试将标志从[L]更改为[R,L]。

导致重定向到http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona. 页面正确加载了内容,但未重写URL。我的结论是,这条规则是正确的。但是如果没有R标志,我想重写就不能正常工作。根据http://htaccess.madewithlove.be/ 重写的URL正是我想要的。

有人知道这里出了什么问题吗?我的方法完全不可行吗?有什么更好的方法来解决这个问题?谢谢

编辑2014年10月1日-如果对任何人都有帮助,“CDL手册”页面中只有“[bigleaf\\u jobspet\\u cdlmanualbystate]”内容。此函数和其他依赖项位于函数中。我的孩子主题中的php文件。这个特定函数在GET中查找jp\\u stn query参数,读取状态名称,然后从我添加到数据库的表中提取详细内容。然后返回指定状态的HTML。

编辑2014年10月2日-深入WP Codex,我找到了索引的pagename查询变量的引用。php。然后我尝试了一些变化,并提出了这个几乎有效的规则。

RewriteRule ^cdl-manual/([-a-z]+)/$ ?pagename=cdl-manual&jp_stn=$1 [L]
此规则确实加载cdl手动页面,但忽略状态参数值。奇怪的是,如果我在浏览器中键入预期的重写模式,它会加载指定状态所需的页面。

http://blog.jobspetroleum.net/?pagename=cdl-manual&jp_stn=arizona

2 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

您得到404的原因是重写规则不会将请求URL更改为报告的sin$_SERVER[REQUEST_URI] PHP的变量,wordpress在决定请求什么内容时解析该变量,因为没有这样的页面/cdl手册/亚利桑那州/它显示404。

您需要的是一个wordpress重写规则,以您想要的方式解析url,但我建议您只需简单地创建50个子页面,每个状态一个子页面。这可能有点烦人,但可能与编写和调试代码以完成您想要的任务一样快,而且在进一步进行每状态定制时,速度会更快。

SO网友:Milo

而不是向添加规则。htaccess,您可以使用WordPress重写来执行此操作:

function cdl_rewrite_rule(){
    add_rewrite_rule(
        \'cdl-manual/([-a-z]+)/?$\',
        \'index.php?pagename=cdl-manual&jp_stn=$matches[1]\',
        \'top\'
    );
}
add_action( \'init\', \'cdl_rewrite_rule\' );
这是假设您已经添加jp_stn 到有效查询变量列表:

function cdl_query_vars( $query_vars {
    $query_vars[] = \'jp_stn\';
    return $query_vars;
}
add_filter( \'query_vars\', \'cdl_query_vars\' );
刷新重写以使规则生效,您可以通过访问永久链接设置页面来执行此操作。

结束

相关推荐

Return vs Echo Shortcode

好的,我创建了一个简短的代码,其中echo是一些输出;我发现的问题是,必须返回值而不是echo\'d。我在转换快捷码以返回日期时遇到问题。。我试过了,但它打破了我的短码。。如果此短代码正确返回代码而不是回显代码,那么它会是什么样子?// [service slug=\"foobar\"] function services_shortcode( $atts ) { // Attributes extract( shortcode_atts(