将下拉选择元框添加到自定义帖子类型-似乎RESTAPI正在干扰

时间:2019-12-04 作者:Brian

我有一个自定义的帖子类型,称之为topic. 这是BBPress提供的,但这不是BBPress的问题。

我还有一个帖子类型lessontopic.

我在BBPress中添加了一个元框,以便在BBPress主题后端编辑器中为论坛主题选择一个关联的课程主题,并将其另存为post meta data.

以下是我所做的:

add_action( \'add_meta_boxes\', \'ld_bbpress_display_ldtopic_selector\');

function ld_bbpress_display_ldtopic_selector() {
    add_meta_box( \'ld_bbpress_ldtopic_selector\', __( \'LearnDash bbPress Settings\', \'learndash-bbpress\' ), \'ld_bbpress_display_topic_selector_callback\', \'topic\', \'advanced\', \'high\' );
}

function ld_bbpress_display_topic_selector_callback() {
   My call back stuff
}

add_action( \'save_post_topic\', \'ld_save_associated_ldtopic\',10,1);
function ld_save_associated_ldtopic($topic_id){
    if ( ! wp_verify_nonce( $_POST[\'ld_bbpress_nonce_ldtopic\'], \'ld_bbpress_meta_box_ldtopic\' ) ) {
        return;
    }
    my save stuff
}
现在后端看起来一切正常。但是如果我从meta下拉列表中选择一个课程主题,点击update,并在调试器中逐步完成,我会看到更新是在中执行的

wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

这与以下事实有关:对于我制作的一个允许我选择论坛主题的自定义块,我必须使BBPress主题能够在restAPI中看到,这会神秘地导致后端编辑器点击restAPI端点进行更新。我通过启用

add_filter( \'bbp_register_topic_post_type\', \'enable_restAPI_bbpress_topics\', 10,1);
function enable_restAPI_bbpress_topics ($args) {
    $args[\'show_in_rest\'] = true;
    $args[\'supports\'] = array( \'title\', \'editor\', \'author\', \'thumbnail\', \'excerpt\' );
    return $args;
}
但我不明白:为什么仅仅检查一个帖子类型对restAPI是可见的行为就会导致wordpress的后端编辑器进入一种完全不同的操作模式?我的意思是,我们在谈论后端。如果我启用restAPI,我可以看到这将如何促进无头CMS等,但为什么它会从根本上改变Wordpress处理后端后期编辑的方式?

不知怎的,这导致了我的保存挂钩ld_save_associated_ldtopic 没有看到$_POST 数组,因此看不到nonce数据。

真的很奇怪。我觉得我打破了一些规则,它在咬我,但不知道我需要做什么才能让我的元盒以这种方式工作。

想法?

谢谢Brian

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

但我不明白:为什么仅仅检查一个帖子类型对restAPI是可见的行为就会导致wordpress的后端编辑器进入一种完全不同的操作模式?

WordPress 5.0引入了Block Editor. 这是一个全新的帖子编辑屏幕和帖子编辑方法。它通过使用RESTAPI工作。因此,如果您有一个REST API中不可用的post类型,它将返回到旧的“Classic”编辑器,并继续按以前的方式运行。

如果在REST API中启用了post类型,则除非另有规定(例如使用use_block_editor_for_post_type 过滤器),将改用块编辑器。

使用创建自定义元框add_meta_box 应继续在块编辑器中工作,但为了与块编辑器兼容,必须对其进行不同的处理。记录其工作原理here.

但应该没有问题$_POSTsave_postsave_post_topic 钩如果您正在尝试调试,很可能您看到了错误的请求。编辑器中的大多数更改将发送到REST API端点,并由其处理,但元框将作为单独的请求发布到/wp-admin/post.php, 正常操作将触发的位置。唯一的区别是,现在这种情况发生在后台。

相关推荐

Get_Term_meta()不适用于Pre_Get_Posts()

我试图使用get\\u term\\u meta()函数获取特定类别的自定义术语元值。该值存储在wp\\U termmeta表中。然后,基于该值,我想修改某个类别归档页面的主查询(按日期升序排序帖子)。但是,我使用的pre\\u get\\u posts()钩子不允许这样做。我尝试了我所知道的所有方法,但仍然不起作用这是我的代码:function my_new_category_order( $query ) { //get the category id $cat_id