add_meta_box()

公開日:2024(令和6)年11月26日/最終更新日:

add_meta_box()

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています

add_meta_box()は投稿や固定ページ、カスタム投稿タイプなどの編集画面欄外もしくはサイドバー内にカスタムフィールドの値を管理するための入力欄を作るために使用する関数です。

absint()に関する詳しい情報についてはこちら、または公式ページを参照ください。

本ページの内容は、あくまでもサイト管理者である私の所見と実際に使用した経験などに基づくものであり、解釈が間違っていたり、誤りがあることがありますので、正確な情報は上記の公式ページ等を参照ください

add_meta_box()関数の基本的な使い方

add_meta_box()関数はこれ単体で使用するのではなく、通常は以下のように構成して使用します。

  • ユーザー定義関数を作り、その中にadd_meta_box()関数を使ってメタボックス(入力欄)の基本的な定義をする
  • どのようなカスタムフィールドに対する入力(設定)欄を表示させるのかを定義する別のユーザー定義関数(コールバック関数)を作り、add_meta_box()関数の引数の中で呼び出す
  • initまたはadd_meta_boxesなどのアクションフックを使って機能追加をする(つまり編集画面にメタボックスを表示させる)
  • 表示させた入力欄に入力された値を保存・変更するためのユーザー定義関数を追加して、データの更新を行う

以下が上記の流れを満たすための基本的なコード例です。

// メタボックスを追加する
function my_custom_meta_box() {
    add_meta_box(
        'my_meta_box_id',          // メタボックスのID
        'カスタムフィールド',       // メタボックスのタイトル
        'my_meta_box_callback',    // コールバック関数
        'post',                    // どの投稿タイプに表示するか(ここでは投稿)
        'normal',                  // 表示位置
        'high'                     // 優先度
    );
}
add_action('add_meta_boxes', 'my_custom_meta_box');

// メタボックスの内容を表示する
function my_meta_box_callback($post) {
    // 現在の値を取得
    $value = get_post_meta($post->ID, '_my_custom_field', true);
    // 入力フィールドを表示
    echo '<label for="my_custom_field">カスタムフィールド:</label>';
    echo '<input type="text" id="my_custom_field" name="my_custom_field" value="' . esc_attr($value) . '" />';
}

// 投稿の保存時にカスタムフィールドの値を保存する
function my_save_meta_box_data($post_id) {
    // 自動保存の場合は何もしない
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    // 権限チェック
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    // フィールドの値を保存
    if (isset($_POST['my_custom_field'])) {
        update_post_meta($post_id, '_my_custom_field', sanitize_text_field($_POST['my_custom_field']));
    }
}
add_action('save_post', 'my_save_meta_box_data');

なお実装する場合には、セキュリティ面に配慮して、以下のように「その場所」で入力されたかを判断するためのnonce検証を行うようにした方がいいでしょう。

// メタボックスを追加する
function my_custom_meta_box() {
    add_meta_box(
        'my_meta_box_id',          // メタボックスのID
        'カスタムフィールド',       // メタボックスのタイトル
        'my_meta_box_callback',    // コールバック関数
        'post',                    // どの投稿タイプに表示するか(ここでは投稿)
        'normal',                  // 表示位置
        'high'                     // 優先度
    );
}
add_action('add_meta_boxes', 'my_custom_meta_box');

// メタボックスの内容を表示する
function my_meta_box_callback($post) {
    // 現在の値を取得
    $value = get_post_meta($post->ID, '_my_custom_field', true);
    
    // nonceフィールドを追加
    wp_nonce_field('my_custom_nonce_action', 'my_custom_nonce_field');

    // 入力フィールドを表示
    echo '<label for="my_custom_field">カスタムフィールド:</label>';
    echo '<input type="text" id="my_custom_field" name="my_custom_field" value="' . esc_attr($value) . '" />';
}

// 投稿の保存時にカスタムフィールドの値を保存する
function my_save_meta_box_data($post_id) {
    // 自動保存の場合は何もしない
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    
    // 権限チェック
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    // Nonceの検証
    if (!isset($_POST['my_custom_nonce_field']) || !wp_verify_nonce($_POST['my_custom_nonce_field'], 'my_custom_nonce_action')) {
        return;
    }

    // フィールドの値を保存
    if (isset($_POST['my_custom_field'])) {
        update_post_meta($post_id, '_my_custom_field', sanitize_text_field($_POST['my_custom_field']));
    }
}
add_action('save_post', 'my_save_meta_box_data');

nonce検証の仕組みや使い方については以下をご覧ください。

Lolipop ServerMoshimo Ad x-serverMoshimo Ad