我很难让我的自定义帖子类型URL正常工作。我找到的每一个解决方案都削弱了另一个需要工作的部分。我要做的是domain.com/post_type/post_id/post_name
.
除了档案馆之外,我所有的东西都适用于:
register_post_type(\'post-type\',
array(
\'rewrite\' => array(
\'slug\' => \'post-type/%post_id%\',
\'with_front\' => false,
\'pages\' => true,
\'ep_mask\' => 1
)
))
那么我有:
add_filter(\'post_type_link\', \'custom_post_type_link\', 1, 3);
function custom_post_type_link($post_link, $post = 0, $leavename = false) {
if ($post->post_type == \'post-type\')) {
return str_replace(\'%post_id%\', $post->ID, $post_link);
} else {
return $post_link;
}
}
所以我在想办法
domain.com/post_type
工作。它目前抛出一个404。
我知道如果我拆下过滤器/%post_id%
从我的重写中可以看出,存档将起作用。在此基础上,我尝试添加重写规则:
add_action( \'init\', \'custom_rewrites_init\' );
function custom_rewrites_init(){
add_rewrite_rule(
\'post-type/([0-9]+)?$\',
\'index.php?post_type=post-type&p=$matches[1]\',
\'top\' );
}
这样做,如果有人输入,URL不会重定向
domain.com/post_type/post_id
和
domain.com/post_type/post_id/post_name/2
不起作用。
有人知道最好的方法吗?
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成
您的代码/解决方案非常好。您使用slug
以非常智能的方式使用param,因此WordPress会自动创建正确的permastruct
对于本CPT。
我想你唯一错过的就是has_archive
参数。默认值为false
你没有把它设为真。因此WordPress不会为您的CPT创建归档链接/页面。
has\\u存档(布尔或字符串)
(可选)启用post类型存档。
默认情况下,将使用$post\\U type作为归档段塞。默认值:错误注释:如果启用了重写,将生成正确的重写规则。还可以使用“重写”更改所使用的slug。
如果您这样做,WordPress将为归档页创建重写规则。会有一个小问题。它们将包含%post_id%
在他们身上。但这很容易纠正。您只需在register_post_type
电话:
global $wp_rewrite;
$new_rules = array();
foreach ( $wp_rewrite->extra_rules_top as $key => $rule ) {
echo $key;
if (strpos($key, \'post-type/%post_id%/\') === 0 ) {
$new_rules[ str_replace(\'%post_id%/\', \'\', $key) ] = $rule;
unset( $wp_rewrite->extra_rules_top[$key] );
}
}
$wp_rewrite->extra_rules_top = $wp_rewrite->extra_rules_top + $new_rules;
它将修复WordPress创建的存档页面的规则。这是一个干净的解决方案—它不会留下任何混乱,而且它会处理归档页面(提要等)的所有规则