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


11

新しい投稿を作成するとき、[新規追加]をクリックした直後に投稿エディターが表示されたら、ドロップダウンを使用してカスタムフィールドを選択する代わりに、デフォルトのカスタムフィールド入力をいくつか用意しておきますオープンエンド。

視覚的に、代わりに:

ここに画像の説明を入力してください

私は次のようなものが欲しいです:

ここに画像の説明を入力してください

そのためのプラグイン(CPT、その他のフィールドなど)があることは知っていますが、基本的な関数でそれを行う簡単な方法が欲しいのですが。

私はこのようなものを試しました(私はカスタム投稿タイプ「製品」を使用しています):

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で「新しい投稿」をクリックした直後に)「新しい投稿」のフックが表示されません。何かありますか?

それとも、アイデア全体が間違っていて、別の方法があるのでしょうか?

回答:


9

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

編集

ポスト作成画面で一部のメタフィールド(カスタムフィールド)を事前に選択するには、まずこれらのメタ値を空の値で追加する必要があります。

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

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

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

結論

私ができる唯一の方法は、jQueryを使用するかpostcustom、メタボックスをオーバーロードして、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()
}

今のところ、保存時に何も追加するつもりはありません。ユーザーが編集ページに到着したときに、既に開いているカスタムフィールド入力をいくつか表示しようとしています(スクリーンショットの更新を参照)
mike23

ああ。今私はあなたの問題を理解しています。回答を編集しました。
rofflox '25

3

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

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');

1

save_postアクションを使用し、すべての投稿タイプで実行されるため、投稿タイプをチェックして操作を分離する必要があります。これを機能させるために、これに組み込む必要のあるロジックが明らかにいくつかあります。ユーザーが投稿メタフィールドを空白のままにしたい場合にイライラしないように、デフォルトを一度設定したかどうかをチェックする投稿メタフィールドを設定する必要があります。

(コード例に見られるように)デフォルトを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

私が開発している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;
}

参考:ありget_post_type()ます。また、緩やかな比較を行う場合は、YODAスタイルの条件構文を使用する必要があります。
カイザー2012年

@kaiser YODAスタイルってどういう意味?また、なぜget_post_type($post_id) よりも優れてい$_GET['post_type']ますか?
アジズ2016年

1
比較前の値を使用:'page' === $_GET['post_type']。そうでない場合、シングルを忘れると、2つの値を比較する代わりに値=割り当てるという状況になる可能性があります。そして、それはあなたのデータベースのゴミとして終わるでしょう。=== タイプセーフな比較を使用することもできます(値はpage?であり、タイプstring?の値です)
kaiser

1
@kasierなるほど-最終的なコードは次のようになります'page' === get_post_type($post_id)
アジズ2016年

-1

一部のユーザーが投稿タイプごとにカスタムフィールドを取得する必要がある場合は、以下のコードを私が行った方法のままにして、私にとってはうまくいきます:)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action( 'wp_insert_post'、 'awh_field_type');

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.