2026年5月20日
2026年5月20日
WordPressのカスタマイザーが保存できない場合の解決方法
はじめに
外観のカスタマイザーでロゴや色を変更して「公開」ボタンを押しても設定が保存されない、ページが読み込み中のままになる、「申し訳ありませんが、このアクションは許可されていません」と表示される。カスタマイザーの保存問題はAjax通信の障害が多くの原因です。
症状・原因
カスタマイザーが保存できない主な原因:
- nonceの期限切れ:カスタマイザーを長時間開いているとnonceが無効化される
- JavaScriptエラー:プラグインのJSがカスタマイザーのAjaxを妨げている
- セキュリティプラグイン:WAFやセキュリティプラグインがPOSTリクエストをブロック
- サーバーの設定:mod_securityやファイアウォールのルールに引っかかる
- PHPエラー:カスタマイザー設定のコールバック関数でPHPエラーが発生
解決手順
ステップ1:ブラウザのコンソールとネットワークを確認する
1. F12 → コンソール でJSエラーを確認
2. ネットワーク タブ → 「公開」ボタンを押して/wp-admin/admin-ajax.phpのリクエストを確認
3. レスポンスが-1や0の場合はnonce問題、403の場合はセキュリティブロック
ステップ2:ページを再読み込みしてnonceを更新する
最も簡単な解決策は、カスタマイザーを開き直すことです。
1. カスタマイザーを閉じる(変更は一時保存されている場合あり)
2. 管理画面に戻り、再度カスタマイザーを開く
3. 設定して「公開」をクリック
長時間の編集後はnonceが切れるため、セッションを新しくすることで解決します。
ステップ3:プラグインの競合を確認する
# 全プラグインを無効化してカスタマイザーを確認
wp plugin deactivate --all
特にセキュリティ系プラグインが原因になりやすいです:
- Wordfence
- iThemes Security
- All In One WP Security
- Sucuri
プラグインを無効化して解決した場合は、そのプラグインの設定でカスタマイザーのAjaxを許可します。
ステップ4:mod_securityのルールを確認する
サーバー側でmod_securityが有効な場合、.htaccessに以下を追加します。
# .htaccess — カスタマイザーのAjaxをmod_securityのチェックから除外
<IfModule mod_security.c>
SecRuleRemoveById 981176 981317
SecFilterEngine Off
</IfModule>
または、ホスティング会社にmod_securityのルール除外を依頼します。
ステップ5:カスタマイザーのデバッグを有効化する
// wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', true);
wp-content/debug.logにエラーが記録されます。
ステップ6:カスタマイザー設定のコールバックを確認する
// functions.php — カスタマイザー設定の正しい実装
add_action('customize_register', function($wp_customize) {
// セクションを追加
$wp_customize->add_section('my_section', [
'title' => 'カスタム設定',
'priority' => 30,
]);
// 設定を追加(sanitize_callbackは必須)
$wp_customize->add_setting('my_color', [
'default' => '#0073aa',
'transport' => 'refresh',
'sanitize_callback' => 'sanitize_hex_color', // 必ずサニタイズ
]);
// コントロールを追加
$wp_customize->add_control(new WP_Customize_Color_Control(
$wp_customize,
'my_color',
[
'label' => 'メインカラー',
'section' => 'my_section',
]
));
});
sanitize_callbackが不正な場合、設定が保存されずエラーになります。
ステップ7:カスタマイザーのpostMessage対応
// transport を 'postMessage' にすると Ajax なしでリアルタイムプレビュー
$wp_customize->add_setting('my_setting', [
'transport' => 'postMessage',
'sanitize_callback' => 'sanitize_text_field',
]);
// カスタマイザープレビュー用のJS(customize-preview.js)
(function($) {
wp.customize('my_setting', function(value) {
value.bind(function(newVal) {
$('.my-element').text(newVal);
});
});
})(jQuery);
注意事項
- カスタマイザーのnonceは1時間で期限切れになります。長時間の作業中は定期的に保存してください。
sanitize_callbackのない設定は保存されないことがあります。必ず適切なサニタイズ関数を指定してください。
まとめ
カスタマイザーが保存できない場合はまずページを再読み込みしてnonceを更新します。それでも解決しない場合はJSエラーとセキュリティプラグインの競合を確認します。カスタム設定を実装する場合はsanitize_callbackの指定が必須です。関連記事:nonceエラーの解決方法、WordPressのセキュリティ設定