问题描述
当我创建一个新的帖子,刚刚点击”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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。