问题描述

当我创建一个新的帖子,刚刚点击”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 被显示 (我们正在寻找一个可以在这里使用的动作/过滤器钩子):

  1. WordPress 加载文件 post-new.php

  2. 此文件在 39 线上的数据库中生成一个默认的帖子,其功能是 get_default_post_to_edit()。这很好。基本上这个帖子已经作为一个 auto-draft 在数据库中。不幸的是,这时候没有任何钩子改变这些数据或添加新的东西。

  3. 作为下一步,包括文件 edit-form-advaned.php 。该文件将生成空洞管理页面,并包含基于帖子类型的 supports 参数的所有需要​​的 metaboxes 。

  4. 在线 136 包含定制字段 metabox postcustom,并调用上述功能。再次,我们可以使用的动作钩。

结论

我认为唯一的方法是使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。