发布帖子时,使用代码更改的帖子插件不会反映在编辑器上

时间:2020-01-08 作者:Vivek Athalye

我有一个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;
}

1 个回复
最合适的回答,由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有很多需要学习的地方。

相关推荐

Product-attribute-slug-is-too-long-28-characters-max

谷歌没有解决我的问题,所以。。这里的任何人都知道如何增加woocommerce产品属性slug的字符限制,默认情况下它的字符限制为28个(数据库中最多32个),我需要最多40个。(试图增加到最大128)。我正在测试一个本地站点,其中产品信息来自导入的xml文件,有时某些属性名称的长度刚刚超过28个字符。。将数据库中的相应列从vachar(32)更改为varchar(128),试图更改中的值wc-attribute-functions.php, 将28改为128,但这没有帮助。。// Validate sl