我成功地创建了一个包含自定义字段的元框,并将其限制为显示在自定义帖子类型中。
//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\' );
但是,应该只进入新创建的元盒的自定义创建字段将始终显示在默认的“自定义字段”中。所有帖子类型都会发生这种情况。如下图所示,这里可能存在什么问题?
最合适的回答,由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_boxes
和
save_post
是常规挂钩,这意味着只要操作运行,就会触发回调。因此,您的代码在没有严格要求的情况下运行,例如保存其他类型的帖子时。如果需要,可以使用特定于post类型的挂钩(
add_meta_boxes_product
和
save_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 );