2026年5月20日
2026年5月20日
WordPressのカスタムフィールドが保存できない場合の解決方法
はじめに
記事のカスタムフィールドに値を入力して保存しても消えてしまう、update_post_metaが動いていないようだ、メタボックスの値が保存されない。カスタムフィールドの保存問題はnonce検証・フックの優先度・自動保存のタイミングが原因であることが多いです。
症状・原因
カスタムフィールドが保存されない主な原因:
- nonce検証の失敗:
wp_nonce_fieldとcheck_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エラーの解決方法、カスタム投稿タイプの設定