2026年5月20日

2026年5月20日

WordPressのカスタムフィールドが保存できない場合の解決方法

はじめに

記事のカスタムフィールドに値を入力して保存しても消えてしまう、update_post_metaが動いていないようだ、メタボックスの値が保存されない。カスタムフィールドの保存問題はnonce検証・フックの優先度・自動保存のタイミングが原因であることが多いです。

症状・原因

カスタムフィールドが保存されない主な原因:

  • nonce検証の失敗wp_nonce_fieldcheck_admin_refererのペアが一致していない
  • save_postフックの問題:自動保存・リビジョン保存時にも呼ばれて上書きされる
  • 権限チェック不足current_user_can('edit_post')の確認が漏れている
  • ブロックエディターとの非互換:クラシックエディター用のメタボックスがブロックエディターで動かない
  • カスタム投稿タイプの設定supports'custom-fields'が含まれていない

解決手順

ステップ1:save_postフックの正しい実装

// functions.php — カスタムフィールドを正しく保存する
add_action('save_post', function($post_id) {
    // 自動保存はスキップ
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    
    // リビジョンはスキップ
    if (wp_is_post_revision($post_id)) return;
    
    // nonce検証
    if (!isset($_POST['my_meta_nonce']) ||
        !wp_verify_nonce($_POST['my_meta_nonce'], 'save_my_meta_' . $post_id)) {
        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'])
        );
    }
});

ステップ2:メタボックスとnonceフィールドを追加する

// functions.php — メタボックスを追加
add_action('add_meta_boxes', function() {
    add_meta_box(
        'my_meta_box',
        'カスタム情報',
        'render_my_meta_box',
        'post',
        'normal',
        'high'
    );
});

function render_my_meta_box($post) {
    // nonceフィールドを出力(必須)
    wp_nonce_field('save_my_meta_' . $post->ID, 'my_meta_nonce');
    
    // 保存済みの値を取得
    $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) . '" style="width:100%">';
}

ステップ3:ブロックエディターでカスタムフィールドを表示する

ブロックエディターではデフォルトでカスタムフィールドのパネルが非表示です。

方法1:画面オプションから有効化

1. 記事編集画面の右上「画面オプション」をクリック

2. 「カスタムフィールド」にチェックを入れる

方法2:REST APIでメタフィールドを登録する

// functions.php — REST API経由でのメタフィールド登録
add_action('init', function() {
    register_post_meta('post', 'my_custom_field', [
        'show_in_rest' => true,
        'single'       => true,
        'type'         => 'string',
        'auth_callback' => function() {
            return current_user_can('edit_posts');
        },
        'sanitize_callback' => 'sanitize_text_field',
    ]);
});

ステップ4:カスタム投稿タイプにcustom-fieldsを追加する

// register_post_typeの引数にcustom-fieldsを追加
register_post_type('my_type', [
    'supports' => [
        'title',
        'editor',
        'custom-fields',  // これが必要
        'thumbnail',
    ],
    // ...
]);

ステップ5:ACFやMeta Box プラグインを使う

高度なカスタムフィールドにはAdvanced Custom Fields(ACF)が最も一般的です。

# ACF Free をインストール
wp plugin install advanced-custom-fields --activate

ACFの管理画面から:

1. カスタムフィールド → 「新規追加」

2. フィールドグループ名・フィールドタイプを設定

3. 「表示ルール」で対象の投稿タイプを指定

ステップ6:保存できているかデバッグする

// functions.php — 保存処理をデバッグ
add_action('save_post', function($post_id) {
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    
    error_log('save_post fired for post: ' . $post_id);
    error_log('POST data: ' . print_r($_POST, true));
    
    $result = update_post_meta($post_id, 'my_field', 'test_value');
    error_log('update_post_meta result: ' . var_export($result, true));
}, 10, 1);

注意事項

  • wp_verify_nonceの失敗は黙ってreturnし、エラーを表示しないようにするのがWordPressの慣例です。
  • sanitize_text_field()でサニタイズしてから保存し、XSS攻撃を防いでください。
  • ACFの無料版はフィールドタイプが限られます。繰り返しフィールドなどは有料版が必要です。

まとめ

カスタムフィールドが保存されない場合はDOING_AUTOSAVEチェック・nonce検証・権限チェックの3点を必ず実装します。ブロックエディターではREST APIへのメタ登録が必要です。複雑なカスタムフィールドにはACFの導入を検討してください。関連記事:nonceエラーの解決方法カスタム投稿タイプの設定

お気軽にご相談ください

お見積りへ お問い合わせへ