在ADD_META_BOX中创建的自定义字段在默认自定义元数据框中再次出现

时间:2020-02-21 作者:adrian li

我成功地创建了一个包含自定义字段的元框,并将其限制为显示在自定义帖子类型中。

//define metabox
function product_info_en() {
    add_meta_box( \'english_info\', \'English Info\', \'english_product_name_callback\', array(\'product\'), \'normal\', \'high\' );
}

//add to hook
add_action( \'add_meta_boxes\', \'product_info_en\' );
在产品页面中显示的代码:

// display in add product admin page
function english_product_name_callback( $post ) {
    //ob_start();
    $content = esc_attr( get_post_meta( get_the_ID(), \'product_desc_en\', true ) );

        //here goes the custom field
        echo \'<fieldset><div><label><b>English Product Name:</b></label><br/>\';
        echo \'<input id="product_name_en" type="text" name="product_name_en" style="width:100%; margin:10px 0px"\';
        echo \' value="\';
        echo esc_attr( get_post_meta( get_the_ID(), \'product_desc_en\', true ) );
        echo \'"></div></fieldset>\';

        //here goes the wp_editor
        echo \'<fieldset><div><label><b>English Product Content Info:</b></label><div><br/>\';
        echo \'<div>\';
        wp_editor($content, \'product_desc_en\', array(
            \'wpautop\' => true,
            \'media_buttons\' => true,
            \'textarea_rows\' => 10
            )
            );
        echo \'</div></fieldset>\';
}
下面是执行保存操作的代码:

//save
function enginfo_save_meta_box( $post_id ) {
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
    if ( $parent_id = wp_is_post_revision( $post_id ) ) {
        $post_id = $parent_id;
    }
    $fields = [
        \'product_name_en\',
    ];
    foreach ( $fields as $field ) {
        if ( array_key_exists( $field, $_POST ) ) {
            update_post_meta( $post_id, $field, sanitize_text_field( $_POST[$field] ) );
        }
     }
    update_post_meta( $post_id,\'product_desc_en\', wp_kses_post( $_POST[\'product_desc_en\'] ) );
}
add_action( \'save_post\', \'enginfo_save_meta_box\' );
但是,应该只进入新创建的元盒的自定义创建字段将始终显示在默认的“自定义字段”中。所有帖子类型都会发生这种情况。如下图所示,这里可能存在什么问题?

![enter image description here

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

在元键前面加下划线_ 将其设置为私有,并防止数据显示在默认元数据库中。

因此,与其这样,

update_post_meta( $post_id,\'product_desc_en\', wp_kses_post( $_POST[\'product_desc_en\'] ) );
这样做,

update_post_meta( $post_id,\'_product_desc_en\', wp_kses_post( $_POST[\'product_desc_en\'] ) );
您的自定义元不应显示在默认元框中。

P、 当然,当使用get_post_meta(), 您需要使用带下划线的元键来获取数据

https://developer.wordpress.org/plugins/metadata/managing-post-metadata/#hidden-custom-fields

As a side note

add_meta_boxessave_post 是常规挂钩,这意味着只要操作运行,就会触发回调。因此,您的代码在没有严格要求的情况下运行,例如保存其他类型的帖子时。如果需要,可以使用特定于post类型的挂钩(add_meta_boxes_productsave_post_product) 将代码仅限于所需的情况。

此外,您还可以通过nonce和功能检查向代码中添加额外级别的(健康的)偏执狂,以确保元数据仅在需要时保存。

要向元数据库中添加隐藏的nonce字段,

function english_product_name_callback( $post ) {
  wp_nonce_field( \'my_save_action_\' . $post->ID, \'my_save_action_\' . $post->ID );

  // your code
}
保存时的Nonce和能力检查,

function enginfo_save_meta_box( $post_id, $post, $update ) {
  if ( ! current_user_can( \'edit_post\', $post_id ) ) {
    return;
  }
  $nonce = ! empty( $_POST[\'my_save_action_\' . $post_id] ) ?  $_POST[\'my_save_action_\' . $post_id]: \'\';
  if ( ! $nonce || ! wp_verify_nonce( $nonce, \'my_save_action_\' . $post_id ) ) {
    return;
  }

  // your code  
}
add_action( \'save_post_product\', \'enginfo_save_meta_box\', 10, 3 );

相关推荐

修改CPT上的发布Metabox位置

我一直在努力想如何正确地做到这一点,但还没有找到解决办法。我有一个带ACF字段的CPT。我不能使用前端表单,因为我正在跨多个子网站同步CPT,所以需要使用后端表单。我已经设置好了,发布表单默认为一列,但我无法将发布元框移动到表单底部。。。它位于帖子标题字段下方。这似乎很愚蠢。S你能提供的任何帮助都是巨大的!谢谢