新しい投稿を作成しているとき、 [Add New]をクリックした直後 投稿エディタが表示されたときに、ドロップダウンを使用して使用するカスタムフィールドを選択する代わりに、デフォルトを設定します。カスタムフィールド入力はすでにオープンしています。
視覚的には、
私は何かが欲しいのですが:
そのためのプラグイン(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」のフックはありません。ありますか?
それとも、考え全体が間違っていて、別の方法があるのでしょうか。
アクションフックsave_post
は保存時に呼び出されますが、現時点でメタデータを追加できるかどうかはわかりません。しかし、アクションフックupdated_post_meta
で投稿が保存された後にあなたのメタデータを作成/更新することは可能であるべきです。
投稿作成画面でいくつかのメタフィールド(カスタムフィールド)を事前に選択するには、最初にこれらのメタ値を空の値で追加する必要があります。
ファイルwp-admin/includes/meta-boxes.php
内のpost_custom_meta_box()
関数(これは使用されているメタボックスpostcustom
のコールバックです)を見ると、この関数がlist_meta()
を使用して事前選択されたメタフィールドを作成していることがわかります。
このメタボックスが表示されるまでプログラムの流れを見てみましょう(ここで使用できるアクション/フィルターフックを探しています)。
post-new.php
をロードしますget_default_post_to_edit()
を使用して、データベース内の39
行にデフォルトの投稿を生成します。それはすばらしい。基本的に投稿は自動ドラフトとしてデータベースに既にあります。残念ながら、現時点ではこれらのデータを変更したり新しいものを追加したりするためのフックはありません。edit-form-advaned.php
が含まれています。このファイルはホール管理ページを生成し、投稿タイプのsupports
パラメータに基づいて必要なメタボックスをすべて含みます。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()
}
これは、カスタムフィールドのサポートを追加するための適切な方法です(投稿を編集するときに空白のフィールドは表示されません)。
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');
私が開発している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;
}
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');