问题描述
当我创建一个新的帖子,刚刚点击”Add New” 后,当编辑器显示,而不是使用下拉列表并选择一个自定义字段来使用,我想要一些默认的自定义字段输入已经开放。
在视觉上,而不是:
我想要这样的东西:
我知道那里有插件 (CPT,更多的字段等),但我想用一个简单的方法来做一个基本的功能。
我试过这样的东西 (我使用自定义的帖子类型’product’):
function register_custom_fields( $post_ID ) {
    global $wpdb;
        if( !wp_is_post_revision( $post_ID ) ) {
            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);
        }
}
add_action('edit_product', 'register_custom_fields');
但这似乎不起作用我认为钩子可能是错误的 (因为 edit_post 在更新之后),但是我没有看到”new post” 的任何钩子 (在用户点击 wp admin 中的”new post” 之后) 。有没有 ?
或者也许整个想法是错误的,还有另一种方法?
最佳解决方案
在保存时调用动作钩 save_post,但是我不知道现在是否可以添加元数据。但是在使用动作钩 updated_post_meta 保存帖子后,应该可以创建/更新元数据。
EDIT
对于 pre-select 在后期创建屏幕上的一些元字段 (自定义字段),您必须首先添加一个空值。
如果您在文件 wp-admin/includes/meta-boxes.php 中查看 post_custom_meta_box()函数 (这是使用的 metabox postcustom 的回调),可以看到该函数正在使用 list_meta()创建 pre-selected 元字段。
现在让我们看看程序流程,直到这个 metabox 被显示 (我们正在寻找一个可以在这里使用的动作/过滤器钩子):
- 
WordPress 加载文件
post-new.php - 
此文件在
39线上的数据库中生成一个默认的帖子,其功能是get_default_post_to_edit()。这很好。基本上这个帖子已经作为一个 auto-draft 在数据库中。不幸的是,这时候没有任何钩子改变这些数据或添加新的东西。 - 
作为下一步,包括文件
edit-form-advaned.php。该文件将生成空洞管理页面,并包含基于帖子类型的supports参数的所有需要的 metaboxes 。 - 
在线
136包含定制字段 metaboxpostcustom,并调用上述功能。再次,我们可以使用的动作钩。 
结论
我认为唯一的方法是使用 jQuery 或重载 postcustom metabox,并在运行 list_meta()函数之前添加元值。
例如。
add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}
function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');
    // and then copy&past the metabox content from the function post_custom_meta_box()
}
次佳解决方案
这是添加自定义字段支持的正确方法 (编辑帖子时不会得到空白字段)
function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。

