我最近写了一篇answer 对于一个类似的问题,请务必检查它,因为您可以使用相同的代码,除了使用post类型dvposts
而不是ex_article
, 并使用结构d/%dvposts%/%post_id%
.
但窍门很简单:当你打电话的时候register_post_type()
在启用重写的情况下,WordPress总是附加post slug占位符(例如。%dvposts%
在您的情况下),并将该post类型的permalink结构存储在$extra_permastructs
的属性WP_Rewrite
class, 因此,我们可以使用该属性使permalink结构以其他内容结尾,例如,在您的情况下,post ID:
// AFTER you registered the post type:
register_post_type( \'dvposts\', [ \'rewrite\' => [ \'slug\' => \'d\' ], ... ] );
// I.e. register_post_type( \'<post type slug>\', [ your CPT args here ] );
// And the above would give us this permalink structure: d/%dvposts%, i.e. d/<post slug>
// .. override the permalink structure:
global $wp_rewrite;
$wp_rewrite->extra_permastructs[\'dvposts\'][\'struct\'] = \'d/%dvposts%/%post_id%\';
// I.e. $wp_rewrite->extra_permastructs[\'<post type slug>\'][\'struct\'] = \'<your structure>\';
// And now we\'d have this permalink structure instead: d/%dvposts%/%post_id%, i.e. d/<post slug>/<post ID>
如你所见,我们可以完全覆盖整个permalink结构,而不仅仅是在最后添加一些东西。将来,WordPress可能会为我们添加一个API,这样我们就不需要直接访问
WP_Rewrite::$extra_permastructs
(要更改
struct
值),但目前,这是一种简单的方法
此外,%post_id%
是WordPress core中注册的重写标记(或占位符),因此无需调用add_rewrite_tag()
.
更新,尽管%post_id%
是WordPress core中的内置重写标记,您实际上仍然需要手动替换自定义帖子类型的重写标记,因为否则,标记将保持在永久链接URL中的原样(例如。example.com/d/post-slug/%post_id%
).
您可以使用post_type_link
hook 要使用正确的post ID替换该标记,请执行以下操作:
add_filter( \'post_type_link\', function ( $post_link, $post ) {
if ( $post && \'dvposts\' === $post->post_type ) {
return str_replace( \'%post_id%\', $post->ID, $post_link );
}
return $post_link;
}, 10, 2 );
正如我在链接的答案中所说的,不要忘记
flush/regenerate 重写规则!只需访问permalink设置页面,无需单击;“保存”;按钮:)