web-dev-qa-db-ja.com

投稿を作成するときにデフォルトのカスタムフィールドを設定する方法はありますか?

新しい投稿を作成しているとき、 [Add New]をクリックした直後 投稿エディタが表示されたときに、ドロップダウンを使用して使用するカスタムフィールドを選択する代わりに、デフォルトを設定します。カスタムフィールド入力はすでにオープンしています。

視覚的には、

enter image description here

私は何かが欲しいのですが:

enter image description here

そのためのプラグイン(CPT、More fieldsなど)があることは知っていますが、基本的な機能でそれを行う簡単な方法が欲しいのです。

私はこのようなことを試しました(私はカスタムの投稿タイプ '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は更新後に来るので)おそらくそのフックは間違っていると思いますが、(ユーザがwp adminで「new post」をクリックした直後に)「new post」のフックはありません。ありますか?

それとも、考え全体が間違っていて、別の方法があるのでしょうか。

10
mike23

アクションフックsave_postは保存時に呼び出されますが、現時点でメタデータを追加できるかどうかはわかりません。しかし、アクションフックupdated_post_metaで投稿が保存された後にあなたのメタデータを作成/更新することは可能であるべきです。

編集

投稿作成画面でいくつかのメタフィールド(カスタムフィールド)を事前に選択するには、最初にこれらのメタ値を空の値で追加する必要があります。

ファイルwp-admin/includes/meta-boxes.php内のpost_custom_meta_box()関数(これは使用されているメタボックスpostcustomのコールバックです)を見ると、この関数がlist_meta()を使用して事前選択されたメタフィールドを作成していることがわかります。

このメタボックスが表示されるまでプログラムの流れを見てみましょう(ここで使用できるアクション/フィルターフックを探しています)。

  1. WordPressはファイルpost-new.phpをロードします
  2. このファイルは、関数get_default_post_to_edit()を使用して、データベース内の39行にデフォルトの投稿を生成します。それはすばらしい。基本的に投稿は自動ドラフトとしてデータベースに既にあります。残念ながら、現時点ではこれらのデータを変更したり新しいものを追加したりするためのフックはありません。
  3. 次のステップとして、ファイルedit-form-advaned.phpが含まれています。このファイルはホール管理ページを生成し、投稿タイプのsupportsパラメータに基づいて必要なメタボックスをすべて含みます。
  4. 136行にカスタムフィールドmetabox postcustomが含まれており、上記の関数が呼び出されます。繰り返しますが、私たちが使用できるアクションフックはありません。

結論

私はあなたができる唯一の方法はあなたがlist_meta()関数を実行する前にjQueryを使うかpostcustomメタボックスをオーバーロードしてメタ値を追加することであると思います。

例えば。

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()
}
8
rofflox

これは、カスタムフィールドのサポートを追加するための適切な方法です(投稿を編集するときに空白のフィールドは表示されません)。

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');
3
Yuri Korolov

私が開発しているWPサイトの各カスタム投稿に固有のメタ説明があることを期待しています。だから私もデフォルトのカスタムフィールドを探していてここに上陸しました。

これはかなり古い投稿ですが、 mariokostelac.com で見つけた簡単な回答を投稿したいと思いました。

kgは私の名前空間です、あなたは関数に好きな名前を付けることができます。私はフックとWPのカスタマイズは一般的にはかなり新しいですが、私はwp_insert_postがあなたが探しているフックだと思います。

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}
1
kaplan

Save_postアクションを使用し、これがすべての投稿タイプで実行されるので、投稿タイプをチェックして操作を分離する必要があります。それがあなたのために働くようにするためにあなたがこれに組み入れなければならないであろうもう少し論理が明らかにある。デフォルトを1回設定したかどうかを確認する投稿メタフィールドを設定して、投稿メタフィールドを空白のままにしてもユーザーが不満を感じないようにする必要があります。

(コード例のように)デフォルトをnullにしたい場合は、関数を作成しないでください。オーバーヘッドが増えるだけで、ポストメタフィールドにはデフォルトで値が入力されません。

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
1
Brian Fegter