如何在自定义POST类型中重写固定链接结构的开头和结尾?

时间:2020-06-23 作者:38365

我创建了一个自定义的帖子类型,名为;dvposts“;并且无法让permalink结构完全按照我的要求显示。

我的常规帖子/页面结构是/%postname%/%post_id%/.

我希望我的自定义帖子类型结构为/d/%postname%/%post_id%/, 使用/d 在一开始。我还想/d/ 打开archive.php.

通过向register\\u post\\u type()发送某些参数,我可以

  1. /d/%postname%/ 并存档于/d/ 具有

    \'has_archive\' => true,
    \'rewrite\' => array(\'slug\' => \'d\'),
    
  2. /%postname%/%post_id%/ 并存档于/dvposts/ 具有

    \'has_archive\' => true,
    // \'rewrite\' => array(\'slug\' => \'d\'),
    
  3. /dvposts/%postname%/ 并存档于/d/ 具有

    \'has_archive\' => \'d\',
    // \'rewrite\' => array(\'slug\' => \'d\'),
    
  4. /d/%postname%/ 并存档于/d/ 具有

    \'has_archive\' => \'d\',
    \'rewrite\' => array(\'slug\' => \'d\'),
    
我似乎找不到任何关于保持定期设置的永久链接结构的信息(/%postname%/%post_id%/), 但带有静态前缀(/d/) 也可以访问archive.php.

我更愿意在register_post_type(), 但如果这不可能,我正在寻找对性能影响最小的最简单解决方案。

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

我最近写了一篇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设置页面,无需单击;“保存”;按钮:)

相关推荐

Problem with permalinks

我已经更改了类别的基本名称,现在它是“博客”,工作正常。但当我通过/blog/%category%/%postname%/更改结构时。显示404。如果我删除结构中的blog,它会再次工作,但我想使用blog word。问题出在哪里?非常感谢。