【发布时间】:2015-04-10 07:45:13
【问题描述】:
TL;DR
- 在 WordPress add_rewrite_rule 函数中,积极的前瞻是有效的正则表达式吗?我在下面有一个详细信息,虽然看起来有效,但似乎不起作用。
- 是否可以重写 WordPress 自定义帖子类型的帖子 slug,以便多个帖子可以具有相同的帖子名称,但可以通过分配的类别来区分?
设置:
- WordPress 安装
- 3 页 - 'foo'、'bar' 和 'baz'
- 3 个类别 - 'foo'、'bar' 和 'baz'
- 自定义帖子类型 - 'qux'
- “qux”中的帖子被分配 1 个类别 - “foo”、“bar”或“baz”
- 分配类别后,自定义帖子 slug 应显示为 '/[category]/[custom-post-name]/,似乎是同名页面的子页面
问题
在“qux”中分配给不同类别的帖子可以具有相同的名称,例如可以有帖子 'norf'[1] 分配给 'foo' 和帖子 'norf'[2] 分配给 'bar'。
显然 WordPress 不允许重复的页面 slug,所以我附加了具有相同名称的帖子和类别修饰符(例如,'norf-fo'(帖子'norf'分配给'foo')和'norf-br '(分配给'bar'的'norf'帖子))。这给了我前端的“/foo/norf-fo/”和“/bar/norf-br/”。我的问题是如何使用 WordPress 的重写 API 来获得 '/foo/norf/' 和 '/bar/norf/'?
我目前的解决方案
通过使用以下方法,我设法使 URL 在编辑器中正确显示:
function replace_link( $link, $post = 0 ) {
if ( $post->post_type == 'qux' && in_category( array( 'foo', 'bar', 'baz' )) ) {
$terms = get_the_terms( $post->ID, 'category' );
if ( $terms && ! is_wp_error( $terms ) ) :
$links = array();
foreach ( $terms as $term ) {
$links[] = $term->name;
}
$links = str_replace(' ', '-', $links);
endif;
if (in_array("foo", $links)) {
return home_url('foo/'. str_replace('-fo', '', $post->post_name) .'/');
}
if (in_array("bar", $links)) {
return home_url('bar/' . str_replace('-br', '', $post->post_name) .'/');
}
if (in_array("baz", $links)) {
return home_url('baz/'. str_replace('-bz', '', $post->post_name) .'/');
}
} else {
return $link;
}
}
add_filter('post_type_link', 'replace_link', 1, 3);
这很好用,但我的理解是这只是表面上的改变(如果我错了,请纠正我)。然后我使用了以下重写规则:
function custom_rewrite_rule_fo() {
add_rewrite_rule('foo\/(.+?)(?=-fo)','index.php?latest_work=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule_fo', 10, 0);
function custom_rewrite_rule_br() {
add_rewrite_rule('bar\/(.+?)(?=-br)','index.php?latest_work=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule_br', 10, 0);
function custom_rewrite_rule_bz() {
add_rewrite_rule('baz\/(.+?)(?=-bz)','index.php?latest_work=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule_bz', 10, 0);
我已经在各种在线测试器中测试了正则表达式,它似乎可以工作(请参阅https://regex101.com/r/tL1iV4/1)。
然而 WordPress 没有,并且在查看页面时,它会重写为 '/qux/norf-fo/' 和 '/qux/norf-br/' 等。我得出的结论是,这是因为 WordPress ' 正则表达式不支持我使用过的积极前瞻。
我认为这完全是由于我糟糕的正则表达式技能,但我已经尝试了很多排列,但似乎没有得到任何帮助......非常感谢任何帮助! :)
【问题讨论】:
标签: php regex wordpress url-rewriting custom-post-type