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. レスポンスが-10の場合は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のセキュリティ設定

お気軽にご相談ください

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