为什么重写规则适用于页面,而不适用于自定义帖子类型的帖子?

时间:2014-11-27 作者:Ralph

Update: 我了解到,当自定义重写规则用于子/父页面/帖子时,可能会重写自定义重写规则并删除任何参数变量。我的自定义重写规则的目的不是子/父项,而是自定义帖子类型的一部分。这是否会导致类似的重写问题(删除的参数变量)?

Update 2 (Problem Solved): 正如上面的更新中所提到的,它涉及到自定义post类型post的重写规则,这确实是导致问题的原因。请参见my anwer 对于解决方案。

My question

当使用下面的代码时,实际的post重写似乎是可行的,因为它正确地引导到ID为的post160. 即使使用一个漂亮的参数URL,它也能做到这一点。但一旦漂亮的参数URL被重定向到ID为160的帖子,所有参数值都会消失。

在使用漂亮的参数URL时,如何让WP不删除自定义参数?

所以URL如下:

site.com/post/parameter-value/

应重定向(至ID为160的帖子)如下:

site.com/custom-post-type-slug/post-title-of-160/parameter-value/ (未删除参数值)

The code I\'m using

function add_custom_query_vars($vars) {
    $vars[] = \'member_view\';
    return $vars;
}
add_filter(\'query_vars\', \'add_custom_query_vars\');

function add_rewrite_rules($rules) {
$newrules = array(\'page/([^/]+)/?$\' => \'index.php?page_id=158&member_view=$matches[1]\',
                  \'post/([^/]+)/?$\' => \'index.php?p=160&member_view=$matches[1]\');
$rules = $newrules + $rules;
return $rules;
}
add_filter(\'rewrite_rules_array\', \'add_rewrite_rules\');

The details

我使用上面的代码将URL重写为漂亮的URL,并以漂亮的自定义参数值结束。以下是有效和无效的内容:

For Pages (this works)

页面的重写规则有效。URL,如:

site.com/page/parameter-value/

重定向(到ID为158的页面)如下所示:

site.com/page-title-of-158/parameter-value/

get_query_var(\'member_view\') 退货parameter-value.

For Posts (using non-pretty URL) (this works)

对于帖子,只有在使用“非漂亮”URL时,参数才会保持不变:

site.com/?p=160&member_view=parameter-value

或:

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

两者都重定向(到ID为160的帖子),如下所示:

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

以及member_view 可以检索值。

For Posts (using pretty URL) (this does not work)

使用漂亮的参数URL时,自定义参数会在canonical.php 重定向过程已完成。因此,URL如下所示:

site.com/post/parameter-value/

重定向(到ID为160的帖子)如下:

site.com/custom-post-type-slug/post-title-of-160/ (参数值消失)

两者都有get_query_var(\'member_view\')$_GET[\'member_view\'] 不返回任何内容。

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

嗯,我找到了解决办法。似乎,当在自定义帖子类型帖子上应用重写规则时,需要在重写规则本身中告诉WP自定义帖子类型的名称。

下面是代码NOT 工作(重定向和删除参数变量,而不是重写):

function add_rewrite_rules($rules) {
    $newrules = array(\'cpt-slug/([^/]+)/([^/]+)/?$\' => \'index.php?p=$matches[1]&member_view=$matches[2]\');
    $rules = $newrules + $rules;
    return $rules;
}
add_filter(\'rewrite_rules_array\', \'add_rewrite_rules\');
这是代码DOES 工作(重写并保留参数变量):

function add_rewrite_rules($rules) {
    $newrules = array(\'cpt-slug/([^/]+)/([^/]+)/?$\' => \'index.php?p=$matches[1]&post_type=cpt_name&member_view=$matches[2]\');
    $rules = $newrules + $rules;
    return $rules;
}
add_filter(\'rewrite_rules_array\', \'add_rewrite_rules\');
重写成功了一次&post_type=cpt_name 已添加到其规则中。我很惊讶,在我找到并阅读的任何与重写规则相关的信息中,都没有明确指出这一点(我搜索了2天):)

如下所示的URL:

site.com/cpt-slug/INSERT-ID-OF-CPT-POST/INSERT-PARAMETER-VARIABLE/

现在将正确重写,并且不会删除参数变量。现在可以使用get_query_var(\'member_view\').

SO网友:PotterSys

搜索add_rewrite_tag 作用您必须添加一个标记来捕捉重写中的任何变量;否则会掉下来的

在您的情况下,这应该可以做到:

add_rewrite_tag( \'%ps-cpt-parameter%\', \'([^/]+)\');
add_rewrite_rule(\'post/([^/]+)/([^/]+)/?\', \'index.php?p=$matches[1]&ps-cpt-parameter=$matches[2]\', \'top\' );

// And then you could get the variable with

get_query_var(\'ps-cpt-parameter\');
顺便说一下add_rewrite_rule 您可以在任何其他规则之前或之后设置自定义重写规则

结束

相关推荐

“NEXT_POSTS_LINK”和“PERVICE_POSTS_LINK”不显示任何内容

我试图在我的单曲中添加“上一篇文章”和“下一篇文章”的链接。php文件没有成功,因为前一个\\u posts\\u link和下一个\\u posts\\u link没有返回任何内容。老实说,我不知道这些按钮放在了什么地方。谢谢<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <div class=\"post-content\"> <?php the_title(