WordPress : Erreur de soumission de formulaire avec get_template_part()

Publié par Jean-Michel le

J’ai rencontré un problème intéressant concernant le get_template_part().

J’ai créé une page d’options de thème (nommée sitewideSettings.php)

normalement, j’inclurais ceci dans functions.php comme ceci:

include(TEMPLATEPATH."sitewideSettings.php");

qui fonctionne bien.

Mais maintenant j’essaie d’utiliserget_template_part();

get_template_part('sitewideSettings');

qui fonctionne également bien sauf que lorsque je clique sur « mettre à jour » pour mettre à jour les paramètres, j’obtiens un message d’erreur : « Êtes-vous sûr de vouloir le faire ? Veuillez réessayer ».

« Veuillez réessayer » renvoie à la page des options de thème et cliquez sur la mise à jour vous ramène au message d’erreur qui vous ramène aux options de thème et nous tournons en rond.

Rien d’autre n’a changé à part l’utilisation deget_template_part();

Quelqu’un d’autre a-t-il rencontré ce problème ? Comment l’avez-vous contourné ? Je suis sûr que c’est quelque chose de simple et d’évident, mais exactement ce que c’est m’échappe totalement.

(Ce n’est pas un problème nonce car un nonce est créé dans les deux cas)

Solution n°1 trouvée

Veuillez ne pas utiliser get_template_part() dans l’Admin / Backend. Il a été conçu pour une utilisation de modèle (affichage du thème, veuillez consulter le codex), il est donc destiné à être utilisé pour les modèles et les parties de modèle dans les thèmes :

Référence de fonction/partie de modèle d’obtention

Load a template part into a template
(other than header, sidebar, footer).
Makes it easy for a theme to reuse
sections of code in an easy to
overload way for child themes.

The function does actually includes general source code as well, but what you experience (as John pointed out) might be related to scope. As I do not know your code, I can not say for sure, if that is the exact cause of the issue you’re facing (variable scope), so I tend to keep it simple in my answer:

The function is just not desgined to replace as standard php code include, for example to write an admin page.

So just do not use it if for your admin page unless you really know what you are doing.


Update:

If you want to load a php file into the global scope while looking in the child and parent theme directory, you can make use of a function that does the search for the file for you: locate_template():

Retrieve the name of the highest priority template file that exists.

Searches in the STYLESHEETPATH before TEMPLATEPATH so that themes which inherit from a parent theme can just overload one file.

For your given example include include(TEMPLATEPATH."sitewideSettings.php"); this can be written as:

include(locate_template('sitewideSettings.php'));

This allows you to control where and how the file is included (include/_once; require/_cone) and it prevents you to have the scope issue in your example which breaks the NONCE mechanism.


The « Please try again » message is there because wp-admin is not able to verify the request, more specifically the so called nonce. There can be two reasons for that: There is none in the request (e.g. the form does not provide any or it does not get’s transferred or read by the admin code) or the nonce is invalid. Nonces always represent a chain of actions, and if that chain is broken, you’ll get that message. But the message does not tells you where that chain is broken.

Those error messages in the admin are not always very informative and can be even misleading (Related: #14060). To find out what happens here, it’s most effective to debug that on the system where the error appears as it can be quite specific which part of the chain is broken.

Veuillez consulter le codex sur la façon de créer des pages d’administration pour votre thème ou plugin pour des informations plus détaillées sur les nonces, les pages d’administration, etc. Il n’est pas possible pour la demande d’administration de valider le nonce pour une raison quelconque.

Solution n°2 trouvée

Je sais que vous dites que ce n’est pas un problème nonce, mais c’est clairement le cas. Cet avis est le message par défaut « Ce nonce n’a pas été extrait ». Je ne sais pas exactement pourquoi le nonce échoue, mais c’est ce qui se passe.

Je revérifierais comment vos nonces sont créés et vérifiés. Si vous utilisez wp_nonce_field()assurez-vous que les valeurs d’action et les valeurs d’argument sont les mêmes. Vérifiez également l’orthographe des variables ou tout problème lié à la portée qui pourrait entraîner l’échec du nonce.

ÉDITER

Suite à votre insistance sur le fait que ce n’est pas un problème nonce (ce qui est le cas. Le problème nonce est causé par un problème de portée), voici ce qui s’est probablement passé. Les fichiers inclus/requis sont exécutés dans la portée dans laquelle ils sont inclus. Je suppose que vous utilisez une variable pour créer soit l’action nonce, soit le nom nonce. Parce get_template_part()qu’il inclut le fichier de modèle dans la portée de cette fonction, il n’est plus exécuté dans la portée du rappel d’affichage de votre page d’administration. Vous devez soit globaliser ces variables dans tous les emplacements, soit utiliser des constantes au lieu de variables.

Solution n°3 trouvée

Difficile de deviner, c’est toute une échelle de fonctions. get_template_part()appelle locate_template()qui appelle load_template()qui fait require.

Je vous suggère de les essayer de bas en haut pour déterminer s’il s’agit get_template_part()exactement ou d’une fonction intermédiaire.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *