如何在自定义帖子类型的重写规则中放置元值?
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?