以下のような手順で、独自の入力項目を作成する。
この例ではカスタム投稿タイプを使った投稿に以下のようなカスタムフィールドを作成。
メタボックスと入力フィールドには、それぞれ固有の ID を指定する必要がある。
add_meta_box() で「作品情報」というタイトルのメタボックスを作成するように指定し、add_action(‘add_meta_boxes’, ~) で適用する。
function add_my_box() {
add_meta_box('works_info', '作品情報', 'works_info_form', 'works', 'normal', 'high');
}
add_action('add_meta_boxes', 'add_my_box');
特定のページにだけメタボックスを追加する方法はこちらを参照。
//第3パラメータで指定した関数の作成
function works_info_form() { //「作品情報」メタボックスに表示する内容
global $post; //編集中の記事に関するデータを保存
wp_nonce_field(wp_create_nonce(__FILE__), 'my_nonce'); //CSRF対策の設定(フォームにhiddenフィールドとして追加するためのnonceを「'my_nonce」として設定)
?>
<div id="works_info">
<p>作品の情報を以下に入力してください。</p>
<p><label>素材(必須): 複数ある場合は、半角英字のカンマで区切って入力してください。<br />
<input type="text" name="material" value="<?php echo esc_html(get_post_meta($post->ID, 'material', true)); ?>" style="width:80%" />
</label></p>
<p><label>写真クレジット(必須): <br />
<input type="text" name="photo" value="<?php echo esc_html(get_post_meta($post->ID, 'photo', true)); ?>" style="width:80%" />
</label></p>
</div>
<?php
}
value=”<?php echo esc_html(get_post_meta($post->ID, ‘material’, true)); ?>”
保存した情報を get_post_meta() で取得し、input 要素の value 属性の値として挿入してデータベースに保存した情報がある場合には、入力フィールドに表示する。
同じキーに複数の値がある場合は最初の値のみを取得(複数の値の指定は難しい)
入力フィールドに textarea 要素を使う場合は <textarea></textarea> の間に余分な空白や改行を入れないようにする。
<textarea name="notice" rows="3" style="width:80%;"><?php echo get_post_meta($post->ID, 'notice', true); ?></textarea>
以下のように記述してしまうと、保存(更新)の際に毎回余分な空白が追加されていってしまう。
NG の例
<textarea name="notice" rows="3" style="width:80%;"> <?php echo get_post_meta($post->ID, 'notice', true); ?> </textarea>
function my_box_save($post_id) {
global $post; //編集中の記事に関するデータを保存
$my_nonce = isset($_POST['my_nonce']) ? $_POST['my_nonce'] : null; //設定したnonce を取得(CSRF対策)
if(!wp_verify_nonce($my_nonce, wp_create_nonce(__FILE__))) { //nonce を確認し、値が書き換えられていれば、何もしない(CSRF対策)
return $post_id;
}
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; }
//自動保存ルーチンかどうかチェック。そうだった場合は何もしない(記事の自動保存処理として呼び出された場合の対策)
if(!current_user_can('edit_post', $post->ID)) { return $post_id; }
//ユーザーが編集権限を持っていない場合は何もしない。
if($_POST['post_type'] == 'works'){ //'works' 投稿タイプの場合のみ実行
//「material, photo」の入力フィールドに入力された情報を保存&更新するように指定
update_post_meta($post->ID, 'material', $_POST['material']);
update_post_meta($post->ID, 'photo', $_POST['photo']);
}
}
add_action('save_post', 'my_box_save');
update_post_meta($post->ID, ‘カスタムフィールド名’, $_POST[‘入力フィールドのID’])により、入力された値がカスタムフィールドの値に更新される。
function add_my_box() {
add_meta_box('works_info', '作品情報', 'works_info_form', 'works', 'normal', 'high');
}
add_action('add_meta_boxes', 'add_my_box');
function works_info_form() {
global $post;
wp_nonce_field(wp_create_nonce(__FILE__), 'my_nonce');
?>
<div id="works_info">
<p>作品の情報を以下に入力してください。</p>
<p><label>素材(必須): 複数ある場合は、半角英字のカンマで区切って入力してください。<br />
<input type="text" name="material" value="<?php echo esc_html(get_post_meta($post->ID, 'material', true)); ?>" style="width:80%" />
</label></p>
<p><label>写真クレジット(必須): <br />
<input type="text" name="photo" value="<?php echo esc_html(get_post_meta($post->ID, 'photo', true)); ?>" style="width:80%" />
</label></p>
</div>
<?php
}
function my_box_save($post_id) {
global $post;
$my_nonce = isset($_POST['my_nonce']) ? $_POST['my_nonce'] : null;
if(!wp_verify_nonce($my_nonce, wp_create_nonce(__FILE__))) {
return $post_id;
}
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; }
if(!current_user_can('edit_post', $post->ID)) { return $post_id; }
if($_POST['post_type'] == 'works'){
update_post_meta($post->ID, 'material', $_POST['material']);
update_post_meta($post->ID, 'photo', $_POST['photo']);
}
}
add_action('save_post', 'my_box_save');
nonceフィールドはフォームの内容が現在のサイトから来たものであり、他のサイトからではないということを認証するために使われる。