編集画面にメタボックスを使って独自のカスタムフィールドの入力項目を追加することができるが、add_meta_box() の第4パラメータでは、ページの種類しか指定できず、特定の固定ページのみに表示することができない。
function add_my_box() { $post_id = ''; if(isset($_GET['post']) || isset($_POST['post_ID'])) { $post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ; } $page_id = get_id_by_post_name('news'); //スラッグが「news」の固定ページの ID // ID を比較して、合致すればメタボックスを追加 if ($post_id == $page_id) { add_meta_box('my_all_meta_1', 'My Custom Meta Box 1', 'my_meta_setup_1', 'page', 'normal', 'high'); } //適用しているテンプレートを取得 $template_file = get_post_meta($post_id,'_wp_page_template',TRUE); // テンプレートを比較して、合致すればメタボックスを追加 if ($template_file == 'home.php') { add_meta_box('my_meta_2', 'My Custom Meta Box 2', 'my_meta_setup_2', 'page', 'normal', 'high'); } } add_action('add_meta_boxes', 'add_my_box'); //投稿スラッグから投稿IDを取得する関数の定義 function get_id_by_post_name($post_name) { global $wpdb; $id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '".$post_name."'"); return esc_html($id); }
フィールドに入力した情報は、update_post_meta() を利用してカスタムフィールドのデータとしてデータベースに保存するが、その際には以下のような条件を使って保存する。(「更新」や「公開」をクリックした場合には、$_POST[‘post_ID’] で ID を取得して判定)
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; } //get_id_by_post_name(上記で独自に定義した関数)を使用しない場合は、直接 ID を記述する。 if ($_POST['post_ID'] == get_id_by_post_name('news')){ update_post_meta($post->ID, 'posts_count', $_POST['posts_count']); } } add_action('save_post', 'my_box_save');
入力フィールドの追加など独自のカスタムフィールドの入力項目の追加についての詳細は「編集画面にメタボックスを使って独自のカスタムフィールドの入力項目を追加」を参照。
以下は、スラッグが「news」の固定ページにのみ独自のカスタムフィールドを追加する例。
//メタボックスの作成 function add_my_box() { $post_id = ''; if(isset($_GET['post']) || isset($_POST['post_ID'])) { $post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ; } if ($post_id == get_id_by_post_name('news')){ add_meta_box('news', 'News', 'news_form', 'page', 'normal', 'high'); } } add_action('add_meta_boxes', 'add_my_box'); //メタボックスに入力フィールドの追加 function news_form() { global $post; wp_nonce_field(wp_create_nonce(__FILE__), 'my_nonce'); ?> <div id="news"> <p>最新情報のページで、1ページ当たりに表示する件数を入力してください。</p> <p><label>表示する件数:半角英数字で入力<br /> <input type="text" name="posts_count" value="<?php echo esc_html(get_post_meta($post->ID, 'posts_count', 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; } //get_id_by_post_name(独自に定義した関数)を使用しない場合は、直接 ID を記述する。 if ($_POST['post_ID'] == get_id_by_post_name('news')){ update_post_meta($post->ID, 'posts_count', $_POST['posts_count']); } } add_action('save_post', 'my_box_save'); //投稿スラッグから投稿IDを取得する関数の定義 function get_id_by_post_name($post_name) { global $wpdb; $id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '".$post_name."'"); return esc_html($id); }