使用Gutenberg编辑器在文章中不保存自定义Meta Box

时间:2020-05-03 作者:Tony Djukic

我已经阅读了很多关于它的文档,这里有很多其他的答案,但我似乎不明白为什么我试图添加到帖子(和页面,但让我们一次从一个开始)的自定义元框没有保存帖子元。我有一个定制的CPT,它工作得很好。我甚至使用Select2方法作为主题选项的一部分,它允许我将最多8篇文章从我的CPT分配到首页。这非常有效。

我遇到的问题是如何使用传统的add\\u metabox方法将选定的帖子从CPT保存到帖子元。Select2功能完美,我可以搜索和选择任意数量的CPT。当我在帖子上单击“更新”时,它们会显示,小轮子会旋转,看起来好像已经保存了帖子元。但是,保存的post meta不会显示在数据库中。

以下是我所拥有的:

//REGISTER CPT META SO BLOCK EDITOR CAN SAVE IT TO POSTS
function mycpt_register_post_meta() {
    register_post_meta(
        \'post\',
        \'mycpt_cpts\',
        array(
            \'show_in_rest\' => true,
            \'single\' => true,
            \'type\' => \'string\',
        )
    );
}
add_action( \'init\', \'mycpt_register_post_meta\' );

//ADD CPT SELECTION METABOX TO PAGES AND POSTS
function mycpt_add_cpt_selection() {
    $screens = [\'page\', \'post\'];
    foreach( $screens as $screen ) {
        add_meta_box(
            \'mycpt_assignment\',
            \'Assign Quick Links\',
            \'mycpt_assign_metabox\',
            $screen,
            \'side\',
            \'low\',
             array(
                \'__block_editor_compatible_meta_box\' => true,
                \'__back_compat_meta_box\'             => false,
            )
        );
    }
}
add_action( \'add_meta_boxes\', \'mycpt_add_ql_selection\' );

//CPT SELECTION METABOX OPTIONS
function mycpt_assign_metabox( $post ) {
    wp_nonce_field( basename( __FILE__ ), \'mycpt_ql_nonce\' );
    $mycpt_appended_cpts = get_post_meta( $post->ID, \'mycpt_cpts\', false ); ?>
    <select id="mycpt_cpts" name="mycpt_cpts[]" multiple="multiple" style="width:90%;">
    <?php
    if ( mycpt_appended_cpts ) {
        foreach( $mycpt_appended_cpts as $cpt_id ) {
            $cpt_title = get_the_title( $cpt_id );
            $cpt_title = ( mb_strlen( $cpt_title ) > 50 ) ? mb_substr( $cpt_title, 0, 49 ) . \'...\' : $cpt_title;
            echo \'<option value="\' . $cpt_id . \'" selected="selected">\' . $cpt_title . \'</option>\';
        }
    }
    ?>
    </select>
    <small style="display:block;font-size:0.8em;width:95%;">
        Add some instructions here...
    </small>
<?php }
最终,我将开始将这些构建为本地块,但我还没有这样做,还有我正在追逐的最后期限等。从我阅读的所有文档以及这里和其他地方的其他问题/答案来看,这应该是可行的,但事实并非如此。我只是不知道我错过了哪一步。

(对于上下文,我希望允许用户将CPT中的帖子分配到帖子或页面,在模板中,我将使用post meta在侧栏中输出指向CPT的链接列表。)

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

因此,我通常用于保存post meta的方法在这种情况下不起作用,即使在使用classic编辑器时起作用。我不知道为什么,但我确实找到了另一篇文章(https://www.codeinwp.com/blog/make-plugin-compatible-with-gutenberg-sidebar-api/) 有一句话最终引导我找到了一个解决方案。此外,整个,mycpt_register_post_meta() 如果您以这种方式保存数据,则似乎根本不需要函数。为了澄清,我没有在我的问题中实际展示我通常的保存方法,因为它不起作用,而且我早就放弃在这个特定的实例中使用它了,所以我没有包括它(如果有人想看,我可以添加。)

function mycpt_add_cpt_selection() {
    $screens = [\'page\', \'post\'];
    foreach( $screens as $screen ) {
        add_meta_box(
            \'mycpt_assignment\',
            \'Assign Quick Links\',
            \'mycpt_assign_metabox\',
            $screen,
            \'side\',
            \'low\',
             //not even sure that this array is necessary
             array(
                \'__block_editor_compatible_meta_box\' => true,
                \'__back_compat_meta_box\'             => false,
            )
        );
    }
}
add_action( \'add_meta_boxes\', \'mycpt_add_cpt_selection\' );
function mycpt_assign_metabox( $post ) {
    wp_nonce_field( basename( __FILE__ ), \'mycpt_cpt_nonce\' );
    $mycpt_appended_cpts = get_post_meta( $post->ID, \'mycpt_cpts\', false ); ?>
    <select id="mycpt_cpts" name="mycpt_cpts[]" multiple="multiple" style="width:90%;">
    <?php
    if( $mycpt_appended_cpts ) {
        foreach( $mycpt_appended_cpts as $cpt_ids ) {
            foreach( $cpt_ids as $cpt_id ) {
                $cpt_title = get_the_title( $cpt_id );
                $cpt_title = ( mb_strlen( $cpt_title ) > 50 ) ? mb_substr( $cpt_title, 0, 49 ) . \'...\' : $cpt_title;
                echo \'<option value="\' . $cpt_id . \'" selected="selected">\' . $cpt_title . \'</option>\';
            }
        }
    }
    ?>
    </select>
    <small style="display:block;font-size:0.8em;width:95%;">
        Instructions
    </small>
<?php }
function mycpt_assign_save_postdata( $post_id ) {
    if( isset( $_POST[\'mycpt_cpts\'] ) ) {
        update_post_meta( $post_id, \'mycpt_cpts\', $_POST[\'mycpt_cpts\'] );
    }
}
add_action( \'save_post\', \'mycpt_assign_save_postdata\' );
所以一切都按照我想要的方式进行。唯一让我困惑的奇怪是,当我找回post_meta 它实际上是将一个数组放入另一个数组。这是在创建多维数组,当我在其他领域使用相同的方法时,会发生这种情况。

例如,在数据库中,当我将四篇CPT帖子分配给一篇WP帖子时,它会保存为以下内容:

a:2:{i:0;s:2:"65";i:1;s:2:"66";}
这将是:

array(
  0 => "65",
  1 => "66"
)
但是,当我使用get_post_meta(), 我得到的反馈如下:

array(
  0 => array(
    0 => "65",
    1 => "66" 
  ),
)
你可以从中看到select 输出中有2个foreach循环,所以我有一个解决方法,但我仍然要找出如何让它只返回一个数组。

希望其他人觉得这有用。

相关推荐

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

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