重写规则以美化位于新终结点的两个$_GET变量

时间:2015-11-19 作者:unfulvio

我正在尝试创建一个几个层次的永久链接规则。

我有一个基本页面/page-slug/ - 我在它后面附加了一个新端点:/page-slug/my-endpoint/ - 从这里,我需要嵌套一个id和一个字符串,其中包含$_GET 变量,例如/page-slug/my-endpoint/?some_id=123&some_string=string 应成为:/page-slug/my-endpoint/123/string/

我成功注册了所有查询变量,我可以在我的方法中使用它们(例如,如果我注册了var_dump( $wp_query->query_vars ) 他们将出现在通过设置的位置$_GET).

我无法使用的是重写规则来将URL转换为永久链接(此代码段运行于init 挂钩时间):

    foreach ( $this->query_vars as $key => $var ) {

        add_rewrite_endpoint( $var, EP_PERMALINK | EP_PAGES, $var );

        if ( \'my-endpoint\' == $key ) {

            add_rewrite_tag( \'%some_id%\',   \'([^&]+)\' );
            add_rewrite_tag( \'%some_string%\', \'([^&]+)\' );

            $page_id   = get_some_page_id(); 
            $page_slug = get_post( $page_id )->post_name;

            // e.g. /page-slug/my-endpoint/123/some-string/
            add_rewrite_rule(
                "{$page_slug}/{$var}/([^/]*)/([^/]*)/?$",
                \'index.php?page_id=\' . $page_id . \'&some_id=$matches[1]&some_string=$matches[2]\',
                \'top\'
            );

        }
    }
我测试了regex,看起来没有错,它捕捉到了我需要的东西(123some-string).

高达\'page-slug/\' 还有\'page-slug/my-query-var/ (2层深)它工作得很好,是两个重写标记在一个非常永久的结构中使用时不起作用。

我试过了https://wordpress.org/plugins/monkeyman-rewrite-analyzer/ 规则就在那里,但我不确定它们的解释

1 个回复
最合适的回答,由SO网友:cybmeta 整理而成

我认为您使用的端点不正确。创建内点时,使用与端点同名的查询变量创建新的重写规则;其值取自端点定义后面的字符串。因此,如果您注册“我的端点”并构建此URL:

/page-slug/my-endpoint/123/some-string
端点传递为my-endpoint=123/some-string.

据我从您的代码中了解,您不需要my-endpoint 查询var,因此不需要注册它;或者您可以注册false 查询变量参数的值(此参数当前未记录在codex 但存在于source code):

add_rewrite_endpoint( $var, EP_PERMALINK | EP_PAGES, false );
或者,如果只希望端点位于页面中,请执行以下操作:

add_rewrite_endpoint( $var, EP_PAGES, false );
还有,你检查一下\'my-endpoint\' == $key 但随后包括$var 作为端点名称和URL的一部分,而不是$key.

不知道是什么$this->query_varsget_some_page_id() 是的,我无法准确测试您的代码,但这应该可以:

foreach ( $this->query_vars as $key => $var ) {

    if ( \'my-endpoint\' == $key ) {

        add_rewrite_tag( \'%some_id%\',   \'([^&]+)\' );
        add_rewrite_tag( \'%some_string%\', \'([^&]+)\' );

        $page_id   = get_some_page_id(); 
        $page_slug = get_post( $page_id )->post_name;

        // e.g. /page-slug/my-endpoint/123/some-string/
        // $key is equal to my-endpoint here because of the previous check
        add_rewrite_rule(
            "^{$page_slug}/{$key}/([^/]*)/([^/]*)/?$",
            \'index.php?page_id=\' . $page_id . \'&some_id=$matches[1]&some_string=$matches[2]\',
            \'top\'
        );

    }
}
Note: 在测试此代码之前,不要忘记刷新重写规则。

相关推荐

Permalinks - Archives

WordPress文档说:WordPress offers you the ability to create a custom URL structure for your permalinks and archives. https://codex.wordpress.org/Settings_Permalinks_Screen 我看到此屏幕将如何为特定帖子/页面创建永久链接,但我没有看到此设置屏幕上关于如何为存档帖子/页面创建链接的任何其他详细信息。有人能澄清一下吗?