ちょっとフォーラムで興味深い質問があって、あーこれはいつかありえるかもって思ったのでメモとして残しておきます。
フォーラムで報告があった不具合は要約すると以下の様な感じ。
原因
この不具合は、php.ini
の max_input_vars
というパラメータの制限によるものです。
これは、DOS攻撃を防ぐために PHP 5.3.9 以降で追加されたパラメータで、PHPマニュアルによると以下のように記載されています。
入力変数 を最大で何個まで受け付けるかを指定します (この制限は、スーパーグローバル $_GET、$_POST そして $_COOKIE にそれぞれ個別に適用されます)。 このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。 このディレクティブで設定した数を超える入力変数があった場合は
E_WARNING
が発生し、 それ以降の入力変数はリクエストから削除されます。 多次元配列の場合、この制限は個々の次元ごとにしか適用されません。
つまり、PHPは入力の変数をデフォルトでは1,000個までと制限している一方で、WordPressのカスタムメニューがそのUIの仕様上すごくたくさんの変数をサーバーに送るため、一定のメニューの量を超えるとこの制限に引っかかってしまうようなんです。
対処方法
この現象に遭遇した場合は、php.ini
を変更する必要があります。(もしくはサイトの構成を考えなおす。笑)
しかし、ここで注意なんですが、これはマニュアルにも記載がある通りDOS攻撃をうける可能性を軽減するためのものなので、安易にこのパラメータを増やすことはおすすめできません。
そんなわけで、max_input_vars
の値と実際に登録できるカスタムメニューの数を表として置いておきますので、この不具合に直面した場合は以下の表を参考にして、必要最小限の値を設定するようにしましょう。
max_input_vars | Normal Menu Item Limit (approx) |
---|---|
1000 | 82 |
2000 | 165 |
3000 | 249 |
The WordPress Menu Item Limit or: Help! Half my menu items just disappeared! | SevenSpark から引用
この表はメニューに階層がない状態での値なので、実際にはこれより少なくなるのが一般的だと思います。
あとは、php.iniの設定で以下のような感じで修正してください。
1 2 |
; max_input_vars = 1000 max_input_vars = 2000 |
くどいようですが、これはセキュリティを低下させる可能性がありますので、安易に値を増やすことはやめましょう。
ちなみに、カスタムメニューの設定を保存したあとで php.ini
の値をもとに戻すという手もありますが、このカスタムメニューは毎回全てを保存しなおしているので、何かのはずみで保存ボタンをクリックした際に再び消えてしまいますのでご注意ください。
その他の注意
あと、この不具合はカスタムメニューにかぎらずカスタムフィールド等でも発生する可能性があり、実際にいくつか報告されているようです。
特にAdvanced Custom Fieldsなどのカスタムフィールド系プラグインを使用している場合に、ほいほいと入力ボックスを増やしすぎてしまうらしく、同様の報告がいくつかありました。
そんなわけで、こういうこともあることを頭の片隅に入れておくといいかもです。
さらに詳しい情報は以下のページでどうぞ。(英語)
The WordPress Menu Item Limit or: Help! Half my menu items just disappeared! | SevenSpark