WordPress add_rewrite_rule 和正则表达式前瞻

WordPress add_rewrite_rule and regex positive lookahead

TL;DR

  1. WordPress add_rewrite_rule 函数中的积极前瞻是否有效的正则表达式?我在下面详细介绍了一个,虽然看起来有效,但似乎不起作用。
  2. 是否可以重写 WordPress 自定义 post 类型 post slug,以便多个 post 可以具有相同的 post 名称,但通过它们来区分分配的类别?

设置:

问题

'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,具体取决于分配给他们的类别。

如果有人知道我在页面顶部的原始问题的答案,我仍然很好奇! :)