FOX - WooCommerce Currency Switcher Professional

Paramètres du sélecteur de devises WooCommerce non enregistrés : max_input_vars

Lorsque les paramètres du sélecteur de devises WooCommerce ne s'enregistrent pas, le schéma est presque toujours le même : vous ajoutez des devises ou sélectionnez des pays GeoIP, vous cliquez sur Enregistrer les modifications (Save changes), la page se recharge comme si tout s'était bien passé, et une partie de ce que vous avez saisi a disparu. Dans la plupart des cas, ni FOX ni WordPress n'ont décidé de l'ignorer. C'est PHP qui l'a fait, avant même que WordPress ne voie la requête, parce que le formulaire de réglages envoyait plus de champs que la limite max_input_vars du serveur n'en autorise. Voici comment le reconnaître, comment relever cette limite, et quelles sont les causes plus rares lorsque la limite n'est pas en cause.

Pourquoi les réglages disparaissent après l'enregistrement

Tous les onglets de la page de réglages de FOX (WooCommerce → Réglages → Devise) forment un seul formulaire HTML. Enregistrer les modifications (Save changes) envoie tous les onglets dans une seule requête, et chaque champ du formulaire correspond à une variable :

  • chaque ligne de devise de l'onglet Devises (Currencies) envoie une douzaine de champs : code, taux, intérêt, plancher et plafond du taux, symbole, position, décimales, séparateurs, description, drapeau et indicateur de la devise de base ;
  • chaque pays sélectionné dans les Règles GeoIP (GeoIP rules) est un champ distinct, de sorte que Tout sélectionner (Select all) pour une seule devise en ajoute environ 250 d'un coup ;
  • chaque devise sélectionnée pour une passerelle dans l'onglet Paiements (Payments) est un champ de plus ;
  • les onglets Options, Avancé (Advanced) et Latéral (Side) ajoutent leurs propres réglages par-dessus.

Le paramètre PHP max_input_vars plafonne le nombre de variables qu'une requête peut transporter ; la valeur par défaut est 1000. Quand un formulaire en envoie davantage, PHP conserve les 1000 premières et ignore silencieusement le reste. FOX enregistre alors ce qu'il a reçu, et la plupart des champs qui ne sont pas arrivés sont enregistrés comme vides ou désactivés au lieu de rester tels quels. Si aucun des champs GeoIP n'arrive, les règles GeoIP sont effacées.

Le formulaire est envoyé dans l'ordre de la page : Devises (Currencies), Options, Avancé (Advanced), Latéral (Side), Paiements (Payments), puis GeoIP. La fin du formulaire est coupée en premier, et plus il y a de champs, plus la coupure remonte. D'où les symptômes typiques, du plus courant au moins courant :

  • les pays GeoIP sont conservés pour les premières devises et perdus pour la troisième ou la quatrième ;
  • les sélections de Règles de paiement (Payments rules) sont perdues ;
  • les options des onglets Latéral (Side) et Avancé (Advanced) se désactivent d'elles-mêmes : Plusieurs devises autorisées (Is multiple allowed) repasse sur Non (No), ou l'onglet Paiements (Payments) n'apparaît jamais après l'activation de Règles de paiement (Payments rules), car il n'est affiché que lorsque l'option a réellement été enregistrée ;
  • à partir d'environ 70 devises, la coupure atteint le tableau des devises lui-même : les dernières lignes disparaissent, ou perdent leurs drapeaux, leurs symboles et leurs descriptions.

Vérifier la limite sur votre serveur

Ouvrez WooCommerce → État. Dans la section Environnement du serveur (Server environment), Max. de variables d'entrée PHP (PHP max input vars) indique la valeur actuelle. Comparez-la à une estimation du nombre de champs de votre formulaire : devises × 13, plus chaque pays GeoIP sélectionné, plus chaque devise sélectionnée dans les règles de paiement, plus environ 100 pour tout le reste. Dix devises ne représentent qu'environ 130 champs, mais quatre d'entre elles avec Tout sélectionner (Select all) dans les règles GeoIP en ajoutent environ 1000 de plus, et le formulaire dépasse la limite par défaut en plein onglet GeoIP.

Deux autres moyens de le confirmer :

  • Le journal d'erreurs PHP, si la journalisation est activée, contient un avertissement du type Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini., écrit au moment de l'enregistrement.
  • La valeur stockée diffère de ce que vous avez sélectionné. Avec WP-CLI, wp option get woocs_is_multiple_allowed affiche 1 pour Oui (Yes) ; un 0 après avoir enregistré Oui (Yes) signifie que le champ a été coupé.

Relever max_input_vars

Ce paramètre relève de la configuration PHP du site ; il se modifie donc à l'un de ces endroits, selon l'hébergement :

  • Panneau de contrôle de l'hébergeur. La plupart des panneaux proposent une page de réglages PHP ou un « éditeur PHP INI » où figure max_input_vars. C'est la méthode la plus sûre.
  • php.ini ou .user.ini à la racine du site, lorsque l'hébergeur le permet :
    ; PHP configuration (php.ini or .user.ini in the site root)
    max_input_vars = 5000
    Par défaut, un fichier .user.ini n'est relu que toutes les quelques minutes ; patientez donc avant de tester.
  • .htaccess, uniquement lorsque PHP s'exécute comme module Apache :
    # .htaccess in the site root, at the bottom
    php_value max_input_vars 5000
    Si le site répond par une erreur 500 après cette modification, PHP s'exécute en FastCGI ou en PHP-FPM, qui n'acceptent pas php_value. Supprimez la ligne et utilisez le panneau de contrôle ou .user.ini.
  • Pool PHP-FPM sur votre propre serveur : php_admin_value[max_input_vars] = 5000 dans la configuration du pool, puis redémarrez PHP-FPM.

ini_set('max_input_vars', ...) dans wp-config.php ou dans un plugin ne fonctionne pas. PHP lit le formulaire envoyé avant l'exécution de tout code WordPress, et cette directive ne peut pas être modifiée à l'exécution.

5000 suffit pour la plupart des boutiques. Si plusieurs devises utilisent Tout sélectionner (Select all) dans les règles GeoIP, ou si la boutique compte plus de 200 devises, réglez 10000 ou davantage ; la limite ne sert qu'à protéger le serveur contre des requêtes anormalement volumineuses, et une valeur plus élevée ne coûte rien en usage normal. Ensuite :

  1. rechargez WooCommerce → État et vérifiez que Max. de variables d'entrée PHP (PHP max input vars) affiche la nouvelle valeur ;
  2. ouvrez les réglages de FOX et saisissez de nouveau ce qui a été perdu : les champs coupés ont été enregistrés vides, ils ne reviennent donc pas d'eux-mêmes ;
  3. enregistrez, rechargez la page et vérifiez les règles GeoIP de la dernière devise ainsi que l'onglet Avancé (Advanced).

Autres raisons pour lesquelles un réglage ne se conserve pas

Des devises qui reviennent après leur suppression

FOX a besoin d'au moins deux devises. Lorsque moins de deux sont enregistrées, il revient à sa paire par défaut (USD plus EUR, ou USD plus la devise de votre WooCommerce) ; supprimer une ligne peut donc faire réapparaître une devise que vous veniez de retirer. Pour remplacer une devise, saisissez le nouveau code dans la ligne existante, cliquez sur le bouton d'actualisation à côté de son taux, ajustez le symbole et enregistrez.

Faites-le dans une ligne qui n'est pas marquée comme devise de base. À l'enregistrement, FOX écrit le code de la ligne de base dans le réglage de devise propre à WooCommerce ; modifier ce code change donc la devise de toute la boutique, alors que les prix des produits restent les mêmes nombres qu'avant.

Le bouton Ajouter une devise affiche un message au lieu d'une nouvelle ligne

Ce message provient de la version gratuite de FOX, limitée à deux devises. Ce n'est pas un problème d'enregistrement ; consultez la mise à niveau de FOX de la version gratuite à la version complète.

Les parties de la page dotées de leurs propres boutons d'enregistrement

  • Designer. Les designs du sélecteur sont enregistrés avec les boutons Enregistrer les modifications (Save changes) et Enregistrer et quitter (Save and exit) situés dans le panneau du designer. Le bouton principal Enregistrer les modifications (Save changes) en bas de la page ne les enregistre pas.
  • Profils GeoIP. Ajouter un nouveau profil (Add new profile) et Mettre à jour le profil (Update profile) enregistrent un profil immédiatement. Ajouter à : (Add to:) se contente de copier ses pays dans les règles d'une devise de la page ; ces règles sont enregistrées par le bouton principal Enregistrer les modifications (Save changes), et la même limite de champs s'applique.

Erreur 403 à l'enregistrement

Une page 403 au lieu des réglages rechargés provient d'une règle de sécurité du serveur, généralement mod_security, que la taille ou le contenu de la requête dérange. Consultez l'erreur 403 à l'enregistrement des réglages du plugin.

La page de réglages est vide, se charge sans fin ou ses boutons ne font rien

Les onglets, les listes déroulantes et les boutons de la page de réglages sont pilotés par JavaScript. Si Ajouter une devise (Append Currency), Mettre à jour tous les taux (Update all rates) ou les onglets ne réagissent pas, ouvrez la console du navigateur (F12, onglet Console) sur la page de réglages et cliquez de nouveau sur le bouton. Une erreur provenant du script d'administration d'un autre plugin arrête les scripts de FOX sur la même page. Le fichier cité dans l'erreur indique de quel plugin il s'agit ; pour le confirmer, désactivez tout sauf WooCommerce et FOX sur une copie de préproduction et testez de nouveau.

  • Un onglet est vide alors que la page s'est chargée : une feuille de style d'un thème d'administration ou d'un plugin de personnalisation de l'administration masque le contenu. Testez en désactivant ce plugin.
  • La page se bloque après l'activation de l'option Statistiques (Statistic). Réglez Statistiques (Statistic) sur Non (No) dans l'onglet Avancé (Advanced). Si la page ne peut plus du tout être ouverte, exécutez wp option update woocs_collect_statistic 0 avec WP-CLI.
  • L'enregistrement se termine par un délai d'attente dépassé ou une erreur 500. Le journal d'erreurs PHP indique le fichier à l'origine de l'échec.

En dernier recours, les options de FOX peuvent être rétablies à leurs valeurs par défaut en réglant l'option woocs_first_activation sur 0 (wp option update woocs_first_activation 0 avec WP-CLI, ou dans la table wp_options) et en chargeant une fois une page quelconque du site. Cela réinitialise toutes les options (Plusieurs devises autorisées (Is multiple allowed), par exemple, repasse sur Oui (Yes)), efface les règles GeoIP et les règles de paiement, et conserve la liste des devises. Faites d'abord une sauvegarde de la base de données et notez vos réglages.

Checklist

  • Max. de variables d'entrée PHP (PHP max input vars) dans WooCommerce → État vaut 5000 ou plus (10000 avec de longues listes de pays GeoIP).
  • Les données perdues ont été saisies de nouveau et enregistrées une fois de plus après le relèvement de la limite.
  • Les devises ont été remplacées en modifiant une ligne, et non en la supprimant, et la ligne de base n'a pas été touchée.
  • Les designs et les profils GeoIP sont enregistrés avec leurs propres boutons.
  • Aucune erreur dans la console du navigateur sur la page de réglages.

Si les réglages ne se conservent toujours pas avec une limite élevée et une console propre, ouvrez un sujet sur le forum de support de FOX en indiquant le nombre de devises, la valeur de Max. de variables d'entrée PHP (PHP max input vars) et le réglage qui ne s'enregistre pas, et nous l'examinerons.