如何在自定义帖子类型的重写规则中放置元值?

Posted

技术标签:

【中文标题】如何在自定义帖子类型的重写规则中放置元值?【英文标题】:How can I place a meta value in rewrite rule for custom post type? 【发布时间】:2018-06-20 21:34:46 【问题描述】:

我已经完全重写了这个问题,因为它有点长,我担心人们没有完整阅读就跳过它。

我有一个自定义的帖子类型(过程),其中包含一个自定义元键/值和一个我想用作 slug 的页面 ID。

我正在使用此功能(如下)在管理区域创建永久链接,但在查看这些时,页面出现 404 错误。如何创建重写规则以使用相同的格式?

function bv_procedure_parent_slug( $url, $post ) 

    if( get_post_type( $post ) == 'procedure' && get_post_meta( $post->ID, 'procedure_parent', true ) ) 
        $procedure_parent = get_post( get_post_meta( $post->ID, 'procedure_parent', true))->post_name;
        if( $procedure_parent ) 
            $url = str_replace( 'procedure', $procedure_parent, $url );
        
    
    return $url;

add_filter( 'post_type_link', 'bv_procedure_parent_slug', 1, 3 );

这里的目标是我将在此处发布大量帖子,其中包含 procedure_parent => 31 的元键/值(其中 31 是页面 ID,帖子名称是“面孔”)。查看单个帖子时,我希望 URL 不是 /procedure/facelift/,而是 /face/facelift/

为此,我相信在创建重写规则时我需要能够访问 $post,以便我可以使用get_post_meta()

但是怎么做呢?

【问题讨论】:

有人能帮忙吗? 您能否使用默认永久链接、您想要的永久链接和您获得的永久链接编辑您的问题? 更新@JamesJones 其他人可以在这里帮忙吗?我对此一无所知,而且这一定是一件非常简单的事情! @JamesJones 我已经重写了这个问题可能会有所帮助 【参考方案1】:

您的问题似乎有点过于复杂了。如果您执行以下操作,它会起作用吗?

安装Custom Post Type Permalinks插件和 将默认永久链接更改为http://example.com/custompostname/%category%/%postname%/。 然后,不要创建带有类别的页面,而是使用 WordPress 的内置存档功能并为您的自定义帖子制作自定义存档模板。

否则我认为add_permastruct() 是您缺少的功能。我正在对此进行理论化,查看https://wordpress.stackexchange.com/a/253325/58884 的解决方案以解决类似问题。像这样的一些代码:

function my_custom_rewrite() 
    add_permastruct('procedure', '/%parent%/', false);

add_action('init', 'my_custom_rewrite'); 

而不是 'rewrite' => array( 'slug' => '%parent%', 'with_front' => false ) 在 post 类型声明中。该声明的'slug' => '%parent%' 部分是自定义帖子类型名称的可选替换(register_post_type() codex entry 中的$post_type)。因此,如果您有'rewrite' => array( 'slug' => 'wibblewobble', 'with_front' => true),您的网址将从http://example.com/procedure/%postname%/ 更改为http://example.com/wibblewobble/%postname%/。对于'with_front' => false,我认为它没有任何作用。当您输入 'slug' => '%parent%' 时,我认为 WordPress 将其作为字符串而不是动态地对其进行任何处理。

请务必使用flush_rewrite_rules();。您可以在测试时在 init 挂钩函数中使用它,然后在它工作后将其移至主题/插件激活挂钩函数。

祝你好运!

【讨论】:

我在帖子中提到的函数从 %parent% 占位符转换为获取作为元值输入的 ID 的 post_name。它在管理区域中工作,并且永久链接都显示正确的 slug,但是在访问页面时,它显示 404。因此,即使使用刷新重写规则,永久链接也不会更新。 @Lee 这是因为您正在操作字符串以获取看起来正确的地址,但 WordPress 无法解释它,因为它不知道 %parent% 是像 %category% 这样的地址变量, %date%%postname%。您需要使用 add_permastruct 告诉 WordPress 将其解释为变量。不要使用'rewrite' => array( 'slug' => '%parent%' )。有意义吗? 是的,有道理,我会试试这个,明天给你回复,谢谢你的帮助。 嗨,詹姆斯,刚刚尝试了这个并注意到使用您提到的新功能,WP Admin 中显示的永久链接会删除帖子名称,只留下父级? add_permastruct 中是否缺少 arg ? 我不完全确定要删除哪些功能,以及在哪里放置这个新功能。我正在尝试的任何东西似乎对显示的单个帖子视图没有任何影响(总是 404)

以上是关于如何在自定义帖子类型的重写规则中放置元值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义帖子类型永久链接中添加自定义分类?

Wordpress 自定义 SQL 以获取三个具有给定元值的帖子

如何在自定义帖子类型上使用Woocommerce的二级图像上传Metabox?

如何在自定义帖子类型UI菜单图标区域添加字体真棒图标?

WordPress WP_Query:根据自定义元值显示自定义帖子类型,并按另一个自定义元值排序

如何根据语言重写自定义帖子类型 slug?