我有一个CPT(比方说Event
) 带有自定义日期字段(start_date
). 我正在试着生成post slug(post_name
) 像start_date
+ post_title
(分隔符为-
).
我试过使用过滤器wp_unique_post_slug
以及wp_insert_post_data
修改post_name
. 当我发布这篇文章时,slug会在内部进行更改,但不会反映在管理UI上。只有当我刷新页面(再次编辑帖子)时,新的slug才会正确显示。
原因可能是什么?我如何确保在发布帖子时立即显示生成的slug?
一次观察:wp_unique_post_slug
当我发布帖子时,过滤器被调用了4次。在4次调用中,只有第3次调用获取了$_POST
反过来,用于编辑slug的逻辑只在第三次调用期间执行。
下面是我正在使用的代码示例,如果有帮助的话:
public function cpt_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
if( ! in_array($post_type, array(\'Event\', \'CPT2\') ) ) return $slug;
error_log(var_export($_POST, true));
if(isset($_POST[\'start_date\'])) {
// remove any date from post slug
$slug = preg_replace( \'/^\\d{4}-\\d{2}-\\d{2}-/\', \'\', $slug );
$slug = $_POST[\'start_date\'] . \'-\' . $slug;
}
return $slug;
}
最合适的回答,由SO网友:Vitauts Stočka 整理而成
我猜你在使用古腾堡,在这种情况下,这是一个非常重要的问题。
Gutenberg分两步保存post数据(两个单独的http请求,只需使用浏览器中的开发人员工具进行检查)。首先,使用RESTAPI,它保存了古腾堡就绪字段,包括标题、内容和slug。问题是,RESTAPI使用JSON和$_POST
在此保存操作期间为空数组,因此wp_unique_post_slug
胡克跑了,但什么也没做。此外,此JSON请求中甚至没有发送metabox/自定义字段值。
然后Gutenberg执行另一个POST请求来保存其他字段,其中包括旧式元数据库和自定义字段。这次$_POST
值可用,所以钩子可以更新slug值。然而,古腾堡改变管理界面中可见的slug值为时已晚,因为这是在第一次请求期间完成的。
这对我来说是一个有趣的问题,因为我在过去有类似的用例,但这些站点仍然使用经典编辑器。现在没有时间完成解决方案,但我会尝试为您的start_date
字段,将其设置为将值存储为元字段(块的默认值是保存在内容字段内),并将其添加为事件CPT的强制块,然后尝试挂钩wp_unique_post_slug
在REST API调用期间。别忘了,你没有$_POST
值并应使用$request
REST API提供的用于获取start_date
. 关于Gutenberg块和REST API有很多需要学习的地方。