【问题标题】:WordPress add_rewrite_rule and regex positive lookaheadWordPress add_rewrite_rule 和正则表达式积极前瞻
【发布时间】:2015-04-10 07:45:13
【问题描述】:

TL;DR

  1. 在 WordPress add_rewrite_rule 函数中,积极的前瞻是有效的正则表达式吗?我在下面有一个详细信息,虽然看起来有效,但似乎不起作用。
  2. 是否可以重写 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


    【解决方案1】:

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

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

    新的 CPT 设置完成后,我使用 https://wordpress.org/plugins/post-type-switcher/ 将帖子从“qux”移动到各自的新 CPT,具体取决于分配的类别。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多