我有一个使用自定义帖子类型的WordPress博客,我正在使用WCK plugin. 其中之一是post类型shows. 然后,特定节目的永久链接显示为:
http://my-website.com/wordpress/shows/show-slug/
这一切都是通过WP和WCK插件的当前功能完成的。然而,我正在尝试添加另一个“级别”的详细信息,以显示在单个显示页面上。为此,我使用URL查询变量
item 指定此。
例如,如果我想查看某个节目的剧集列表,我可以访问URL:
http://my-website.com/wordpress/shows/show-slug/?item=episodes
这些“项目”在每个节目中都有所不同,或多或少都是任意的,但我已经掌握了单个节目的逻辑。php模板,用于确定URL查询中提供的项目是否是该节目的有效项目。
无论如何,我想使用重写功能使URL更加友好,格式如下:
http://my-website.com/wordpress/shows/show-slug/episodes
这就是我遇到问题的地方。这是我的主题函数中的PHP脚本。用于注册URL查询变量和重写规则的php文件:
function shows_item_tag_registration() {
global $wp;
$wp->add_query_var(\'item\');
}
function shows_item_rule_registration($rules) {
$newrules = array();
$newrules[\'^shows/([^/]+)/([^/]+)/?$\'] = \'index.php?pagename=shows/$matches[1]&item=$matches[2]\';
return $newrules + $rules;
}
add_filter( \'rewrite_rules_array\',\'shows_item_rule_registration\' );
add_action( \'init\',\'shows_item_tag_registration\' );
我自己并没有刷新重写规则,因为我不想丢失WP Admin中永久链接设置编写的规则。相反,正如您所看到的,我正在将规则添加到
rewrite_rules_array 滤器为了应用更改,我在WP admin中重新保存了Permalinks设置,这似乎就达到了目的。
令人沮丧的是,它几乎可以正常工作,但当我尝试访问URL时,最后是项目,就像这样:
http://my-website.com/wordpress/shows/show-slug/episodes
它只是将我重定向到:
http://my-website.com/wordpress/shows/show-slug/
并从查询中删除该项。我发现
this Stack Exchange question 这看起来很相似,但我无法用那里的答案解决我的问题。
最合适的回答,由SO网友:cybmeta 整理而成
可能您没有使用正确的挂钩或正确的重写规则。您正在重写到pagename
, 这是用于页面的。您应该使用name
通过slug获得帖子。
add_filter(\'query_vars\', \'cyb_add_query_vars\');
function cyb_add_query_vars( $vars) {
$vars[] = "item";
return $vars;
}
add_action(\'init\',\'cyb_add_rewrite_rules\');
function cyb_add_rewrite_rules() {
add_rewrite_rule( \'\'^shows/([^/]+)/([^/]+)/?$\'\' , \'index.php?post_type=shows&name=$matches[1]&item=$matches[2]\' , \'top\' );
}
您还可以添加端点并使用URL,如
http://my-website.com/wordpress/shows/show-slug/item/episodes
:
add_action(\'init\',\'cyb_add_endpoint\');
function cyb_add_endpoint() {
add_rewrite_endpoint( \'item\', EP_PERMALINK );
}
别忘了刷新rewirte规则。如果不想对刷新进行编码,请访问wp admin区域中的permalink设置页面,单击save,重写规则将被刷新。