問題描述
當我創建一個新的帖子,剛剛點擊”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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。

