問題描述

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