こんにちは、Morimotoです。
先日、WordPressサイトで「特定の固定ページ内のカスタムフィールドの値が更新されない」という不具合が発生しました。
原因を調べてみたり、AIに聞いてみたりして解決できましたが、初めて遭遇することだったので備忘録代わりに記事として原因と解決策を残しておこうと思います。
同じ不具合でお困りの方の助けになれば幸いです。
発生した不具合:特定の固定ページでカスタムフィールドが更新できない
あるWordPressサイトで、Custom Field Suite (CFS) というカスタムフィールドプラグインを使って、固定ページに商品情報の一覧(ループ行)を表示していました。
現象:
- カスタムフィールドの値を変更し、「更新」ボタンを押しても、値が更新前のままに戻ってしまう。
- テスト環境では問題なく更新できる。
- 他の固定ページにあるカスタムフィールドは問題なく更新できるが、特定の一つの固定ページ(固定ページA)でのみエラーが発生する。
この「特定のページでのみ発生する」という点が、原因特定のカギとなりました。
試したこと:Gemini(AI)と協力して原因を絞り込み
まず、原因が特定できなかったため、技術パートナーである Gemini に相談しながら、可能性のある原因を一つずつ潰していきました。
AIの提案を試すも解決せず
| 提案された原因 | 試したこと | 結果 |
|---|---|---|
| キャッシュ | ブラウザの強制再読み込み、WordPressキャッシュプラグインのクリア、サーバーキャッシュのクリア | 直らない |
| キー名のミス | カスタムフィールドのキー名を確認 | 問題なし |
| プラグイン競合 | Custom Field Suite以外の全てのプラグインを停止して試す | 直らない |
| データ破損 | 問題の固定ページAを複製し、複製したページで更新を試す | 直らない(複製ページでも更新できない) |
サーバーキャッシュのクリアやデータ破損のチェックなど、基本的な対応では解決しませんでした。
原因の特定:ループデータ量とPHP設定の上限
Geminiとのやり取りの中で、「カスタムフィールドがループ行で数が多い」という情報を伝えたところ、原因の核心にたどり着きました。
Geminiが指摘した最も可能性の高い原因は、POSTデータの上限超過です。
これは、カスタムフィールドの入力項目が多すぎると、サーバーのPHP設定で定められた「一度に受け付けられる入力変数(フォームの部品の数)」の上限を超えてしまい、更新データの一部がサーバーに無視されてしまう現象です。
実際にサーバーのエラーログを確認したところ、以下のエラーが記録されていました。
PHP message: PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini.
エラーメッセージは、 「入力変数が 1000 を超えているので、php.ini の max_input_vars の値を増やしてください」 と書かれています。
このサーバーでは max_input_vars がデフォルトの 1000 に設定されており、大量のループデータを持つ固定ページAを更新した際に、入力変数の総数がこの上限を超えてしまい、更新が失敗していたのです。
解決策:php.iniのmax_input_varsを変更する
原因が特定できたため、解決策は非常にシンプルでした。
max_input_vars の値を増やす
本番環境のサーバーのPHP設定を変更し、max_input_vars の値を増やします。
| 設定項目 | 変更前の値(ログから判明) | 変更後の値(解決値の例) |
|---|---|---|
max_input_vars | 1000 | 4000 |
カスタムフィールドのループ行が多い場合は、余裕をもって 4000 や 5000 程度まで引き上げてしまうのが確実です。
PHP設定の変更方法
ご利用のサーバーによって設定方法が異なりますが、以下のいずれかの方法で変更します。
方法1:サーバー管理画面で変更する
多くのレンタルサーバー(Xserver、ConoHa WINGなど)では、管理画面に「PHP設定」や「Web設定」といった項目があり、GUI(画面操作)で max_input_vars の値を変更できます。これが最も簡単な方法です。
方法2:php.ini ファイルで直接変更する
サーバー管理画面からでなくても、直接 php.ini ファイルを編集して変更することも出来ます。php.iniに下記の1行を追記してください。
max_input_vars = 4000
自分はphp.iniファイルでmax_input_vars の値を 4000 に変更したところ、無事に固定ページAのカスタムフィールドの値を更新できるようになり、表示も最新の情報に切り替わるようになりました。
まとめ
WordPressサイトの特定の固定ページのみカスタムフィールドが更新されない場合、 「大量の入力フィールドによる max_input_vars の超過」 を疑いましょう。
| 現象 | 疑うべき原因 | 解決策 |
|---|---|---|
| 特定のページでカスタムフィールドが更新できない | max_input_vars の上限超過 | php.ini(または .htaccess)で max_input_vars の値を引き上げる |
| 全てのページで更新されない | キャッシュ、プラグイン競合、データベース権限 | キャッシュクリア、プラグインの停止、phpinfo()で権限確認 |
ちなみに、max_input_vars のデフォルト値はPHPのバージョンやサーバーによって異なりますが、多くの環境で 1000 に設定されていることが多いです。
カスタムフィールドプラグインのループ機能(繰り返しフィールド)を多用する際は、この max_input_vars の設定に注意してくださいね。
この経験が、皆さんの開発・運用の一助となれば嬉しいです!
それでは。