WordPress add_rewrite_rule 和正则表达式前瞻
WordPress add_rewrite_rule and regex positive lookahead
TL;DR
- WordPress add_rewrite_rule 函数中的积极前瞻是否有效的正则表达式?我在下面详细介绍了一个,虽然看起来有效,但似乎不起作用。
- 是否可以重写 WordPress 自定义 post 类型 post slug,以便多个 post 可以具有相同的 post 名称,但通过它们来区分分配的类别?
设置:
- WordPress 安装
- 3 页 - 'foo'、'bar' 和 'baz'
- 3 个类别 - 'foo'、'bar' 和 'baz'
- 自定义 post 类型 - 'qux'
- 'qux' 中的帖子分配了 1 个类别 - 'foo'、'bar' 或 'baz'
- 一旦分配了一个类别,一个自定义的 post slug 应该读作 '/[category]/[custom-post-name]/,似乎是同名页面的子页面
问题
'qux' 中分配到不同类别的帖子可以具有相同的名称,例如可以有 post 'norf'[1] 分配给 'foo' 和 post 'norf'[2] 分配给 'bar'.
显然 WordPress 不允许重复的页面 slug,所以我附加了 post 具有相同名称的类别修饰符(例如 'norf-fo' (post 'norf' 分配给 'foo') 和 'norf-br'(post 'norf' 分配给 'bar'))。这在前端给了我“/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 ' 正则表达式不支持我用过的正前瞻。
我认为这完全是因为我的正则表达式技能不佳,但我已经尝试了很多很多排列,但似乎没有任何进展......非常感谢任何帮助! :)
找到了一个更简单的解决方案,可以满足我的所有 URL 需求...
我选择了 3 种自定义 post 类型,而不是 1 种自定义 post 类型的 'qux' - 'foo'、'bar' 和'baz'。 3 个自定义 post 类型存档页面中的每一个都代替同名的旧静态页面。
新 CPT 设置完成后,我使用 https://wordpress.org/plugins/post-type-switcher/ 将 post 从 'qux' 移动到各自的新 CPT,具体取决于分配给他们的类别。
如果有人知道我在页面顶部的原始问题的答案,我仍然很好奇! :)
TL;DR
- WordPress add_rewrite_rule 函数中的积极前瞻是否有效的正则表达式?我在下面详细介绍了一个,虽然看起来有效,但似乎不起作用。
- 是否可以重写 WordPress 自定义 post 类型 post slug,以便多个 post 可以具有相同的 post 名称,但通过它们来区分分配的类别?
设置:
- WordPress 安装
- 3 页 - 'foo'、'bar' 和 'baz'
- 3 个类别 - 'foo'、'bar' 和 'baz'
- 自定义 post 类型 - 'qux'
- 'qux' 中的帖子分配了 1 个类别 - 'foo'、'bar' 或 'baz'
- 一旦分配了一个类别,一个自定义的 post slug 应该读作 '/[category]/[custom-post-name]/,似乎是同名页面的子页面
问题
'qux' 中分配到不同类别的帖子可以具有相同的名称,例如可以有 post 'norf'[1] 分配给 'foo' 和 post 'norf'[2] 分配给 'bar'.
显然 WordPress 不允许重复的页面 slug,所以我附加了 post 具有相同名称的类别修饰符(例如 'norf-fo' (post 'norf' 分配给 'foo') 和 'norf-br'(post 'norf' 分配给 'bar'))。这在前端给了我“/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 ' 正则表达式不支持我用过的正前瞻。
我认为这完全是因为我的正则表达式技能不佳,但我已经尝试了很多很多排列,但似乎没有任何进展......非常感谢任何帮助! :)
找到了一个更简单的解决方案,可以满足我的所有 URL 需求...
我选择了 3 种自定义 post 类型,而不是 1 种自定义 post 类型的 'qux' - 'foo'、'bar' 和'baz'。 3 个自定义 post 类型存档页面中的每一个都代替同名的旧静态页面。
新 CPT 设置完成后,我使用 https://wordpress.org/plugins/post-type-switcher/ 将 post 从 'qux' 移动到各自的新 CPT,具体取决于分配给他们的类别。
如果有人知道我在页面顶部的原始问题的答案,我仍然很好奇! :)