在古腾堡发布新帖子时,我如何访问帖子元数据?

时间:2019-01-31 作者:0Seven

我正在更新古腾堡的一个插件。我需要在更新或发布帖子时检查是否存在自定义帖子元字段,因此我已连接到publish_post:

function process_meta( $ID, $post ) {
    if (get_post_meta($ID, \'my_post_meta_field\', true)) {
        // do something
    }
}
add_action(\'publish_post\', \'process_meta\', 10, 2);
问题是,当这个钩子(或我知道的任何其他钩子)启动时,post元字段还没有保存到数据库中,所以除非已经保存了post草稿,my_post_meta_field 在我的代码中,此时始终显示为空。

在我的插件的旧版本中,我只需检查$_POST[] 大堆然而,古腾堡现在通过WordPress API直接保存内容,因此没有POST 要拦截的数据。

我如何解决这个问题?

2 个回复
最合适的回答,由SO网友:0Seven 整理而成

解决方案是使用另一个钩子,该钩子在古腾堡将post元数据保存到WP API后触发。阅读后this related discussion 关于Github和检查this code by n7studios, 我发现rest_after_insert_post 是一个可以使用的钩子。

因此,使用Gutenberg时可靠检查WordPress Post元字段是否存在的方法是:

function read_my_meta_field( $post, $request ) {
    $my_meta_field = get_post_meta($post->ID, \'my_post_meta_field\', true);

    // Process $my_meta_field as desired...
}
add_action(\'rest_after_insert_post\', \'read_my_meta_field\', 10, 2);
请注意,只需更改postadd_action() 函数,因此不使用\'rest_after_insert_post\' 您将使用\'rest_after_insert_whatever\'.

最后,这里是我自己问题的一个更完整的答案,它只在发布后检查元字段。

function run_on_post_publication( $ID, $post ) {
    // Only register this hook if we really are publishing a new post
    add_action(\'rest_after_insert_post\', \'read_my_postmeta_field\', 10, 2);
}
add_action(\'publish_post\', \'run_on_post_publication\', 10, 2);

function read_my_postmeta_field( $post, $request ) {
    $my_meta_field = get_post_meta( $post->ID, \'my_post_meta_field\', true);

    // Process $my_meta_field as desired...
}
作为参考,如果您想更准确地控制代码的运行时间,请查看\'transition_post_status\' hook.

SO网友:Chinmoy Kumar Paul

代替add_action(\'publish_post\', \'process_meta\', 10, 2); 具有add_action(\'save_post\', \'process_meta\', 10, 2);

我的代码:

function process_meta( $ID, $post ) {
    // Saving the data for future use
    if ( isset( $_POST[\'YOUR CUSTOM FIELD NAME\'] ) ) {
        update_post_meta( \'my_post_meta_field\', $_POST[\'YOUR CUSTOM FIELD NAME\']);
    }
}
add_action(\'save_post\', \'process_meta\', 10, 2);
您可以这样访问其他PHP或插件文件中的值get_post_meta( get_the_ID(), \'my_post_meta_field\', true ); .

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在