WordPress Menu Item Limit

WordPress è affetto da un noto bug, che limita il numero di voci di menu implementabili all’interno di un sito, troncandole ad un certo valore limite.

Il problema riguarda solo i “custom menu”: il cosiddetto “default menu” non è affetto dal problema.
Quindi, la soluzione più semplice consiste nel rinunciare ai “custom menu”, ed utilizzare solo il “default menu”.

[box type=”warning”] NOTA: il problema NON riguarda gli utenti del nostro piano hosting WordPress, in quanto lo stesso è contraddistinto da una configurazione particolare dei server che risolve il problema a monte. Le soluzioni di seguito esposte sono destinate quindi solo agli utenti degli altri piani (hosting Linux Basic Illimitato, hosting Linux Pro, hosting Fracto multidominio)[/box]

Qual’è la causa di questo problema?

Con la versione 5.3.9 di php è stata introdotta una nuova direttiva: max_input_vars (che stabilisce il valore massimo di variabili che è possibile trasmettere in una chiamata di tipo POST.
Questo limite è indispensabile per evitare criticità nel server (un elevato numero di variabili in una chiamata di tipo POST è una diffusa tecnica per portare attacchi di tipo DOS).

Contemporaneamente, anche Suhosin PHP Security module dispone di due direttive con scopi simili: suhosin.post.max_vars e suhosin.request.max_vars

Il “custom menu” di WordPress è mal ingegnerizzato, ed usa un numero abnorme di variabili di tipo POST, il cui numero peraltro dipende dal numero di voci implementate nel menu.
Poiché questo numero è limitato dalle già citate max_input_vars, suhosin.post.max_vars e suhosin.request.max_vars, ne consegue che il numero totale di variabili viene troncato, in funzione dei limiti imposti sul server.

Come risolverlo?

Le diverse possibili soluzioni sono, nell’ordine:

  • rinunciare all’utilizzo dei “custom menu” e limitarsi ad utilizzare il “default menu” (nell’attesa magari che la community di sviluppo proponga una funzione di “custom menu” meglio implementata)
  • utilizzare il “custom menu” nel limite di voci consentito dalla specifica installazione
  • utilizzare, al posto del “custom menu”, lo specifico plugin per WordPress UberMenu (che svolge esattamente la funzione che dovrebbe svolgere il “custom menu”, ma è ingegnerizzato correttamente e quindi non abusa di variabili di tipo POST)
  • passare al nostro piano hosting specifico per WordPress

False soluzioni

Su molti forum viene proposto di impostare le direttive coinvolte con valori elevatissimi, del tipo:

[box] max_input_vars = 3000

suhosin.post.max_vars = 3000

suhosin.request.max_vars = 3000[/box]

Ma non si tratta di una soluzione da adottare con attenzione, e comunque non percorribile in un ambiente di hosting shared ad alto carico.

Perché?

  • Perché, di fatto, annulla lo scopo per cui queste direttive sono state introdotte, reintroducendo quindi la stessa vulnerabilità che, con la loro introduzione, era stata scongiurata;
  • perché comporta che sul server vengano implementate quindi altre misure di sicurezza, non sempre altrettanto efficaci ed efficienti
  • perché altri software, diversi da WordPress, potrebbero venir impattati negativamente da impostazione del genere