Php WordPress添加\重写\规则和正则表达式正向前瞻

Php WordPress添加\重写\规则和正则表达式正向前瞻,php,regex,wordpress,url-rewriting,custom-post-type,Php,Regex,Wordpress,Url Rewriting,Custom Post Type,TL;DR 在WordPress add\u rewrite\u规则函数中,正外观是否是有效的正则表达式?我有一个详细的下面,似乎不工作,虽然看似有效 是否可以重写WordPress自定义帖子类型的帖子slug,以便多篇帖子可以具有相同的帖子名称,但可以根据其指定的类别进行区分 设置: WordPress安装 3页-“foo”、“bar”和“baz” 3类-“foo”、“bar”和“baz” 自定义帖子类型-“qux” “qux”中的帖子被分配为一个类别——“foo”、“bar”或“baz”

TL;DR

  • 在WordPress add\u rewrite\u规则函数中,正外观是否是有效的正则表达式?我有一个详细的下面,似乎不工作,虽然看似有效
  • 是否可以重写WordPress自定义帖子类型的帖子slug,以便多篇帖子可以具有相同的帖子名称,但可以根据其指定的类别进行区分
  • 设置:

    • WordPress安装
    • 3页-“foo”、“bar”和“baz”
    • 3类-“foo”、“bar”和“baz”
    • 自定义帖子类型-“qux”
    • “qux”中的帖子被分配为一个类别——“foo”、“bar”或“baz”
    • 一旦分配了一个类别,自定义帖子段塞应该读“/[category]/[custom post name]/,看起来像是同名页面的子页面
    问题

    在“qux”中分配给不同类别的帖子可以具有相同的名称,例如,可以将帖子“norf”[1]分配给“foo”,将帖子“norf”[2]分配给“bar”

    显然WordPress不允许重复的页面段塞,所以我用类别修饰符(例如'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);
    
    我已经在各种在线测试人员中测试了regex,它似乎很有效(请参阅)

    但是WordPress不支持,在查看页面时,它会重新连接到“/qux/norf fo/”和“/qux/norf br/”等。我得出结论,这是因为WordPress的regex不支持我使用的正向前瞻


    我想这完全是因为我的正则表达式技能差,但我尝试了很多排列,似乎没有取得任何进展。。。非常感谢您的帮助!:)

    找到了一个更简单的解决方案,可以满足我所有的URL需求

    我选择了3种自定义帖子类型——“foo”、“bar”和“baz”,而不是1种自定义帖子类型“qux”。3个自定义post类型归档页面中的每一个都替代了同名的旧静态页面

    一旦新的CPT建立起来,我就习惯于根据分配的类别将帖子从“qux”转移到各自的新CPT中


    如果有人能在页面顶部找到我最初问题的答案,我仍然很好奇!:)

    找到了一个更简单的解决方案,可以满足我所有的URL需求

    我选择了3种自定义帖子类型——“foo”、“bar”和“baz”,而不是1种自定义帖子类型“qux”。3个自定义post类型归档页面中的每一个都替代了同名的旧静态页面

    一旦新的CPT建立起来,我就习惯于根据分配的类别将帖子从“qux”转移到各自的新CPT中

    如果有人能在页面顶部找到我最初问题的答案,我仍然很好奇!:)