Erreur de soumission de formulaire avec get_template_part ()
-
-
Veuillez collerici l'URL utiliséepour demander lapage d'administration.Deplus,veuillez collerici l'URL utilisée lors de l'envoi duformulaire.Si vous lepouvez,veuillez également ajoutertous lesparamètres POST.Please paste the URL here that is used to request the admin page. Additionally please paste the URL here that is used when the form get's submitted. If you can, please add all POST parameters as well.
- 0
- 2010-11-10
- hakre
-
J'obtiendrais cetteerreurpour certainsplugins lorsque wp-config.php DEBUGest défini surtrue.I'd get this error for some plugins when wp-config.php DEBUG is set to true.
- 0
- 2012-02-08
- icc97
-
5 réponses
- votes
-
- 2010-11-09
Je sais que vous dites que cen'estpas unproblèmenonce,mais c'est clairement le cas. Cet avisest lemessagepar défaut «Cenoncen'apas vérifié». Jene saispasexactementpourquoi lenonce échoue,mais c'est ce qui sepasse.
Je revérifierais comment vosnonces sont crééset vérifiés. Si vous utilisez
wp_nonce_field()
,assurez-vous que les valeurs d'actionet les valeurs d'argument sontidentiques. Vérifiez également l'orthographe des variables outoutproblème lié à laportée quipourraitentraîner l'échec dunonce.MODIFIER
Suite à votreinsistance sur lefait que cen'estpas unproblème denonce (ce que c'est. Leproblème denonceest causépar unproblème deportée),voici ce qui s'estprobablementpassé. Lesfichiersinclus/requis sontexécutés dans laportée dans laquelleils sontinclus. Je suppose que vous utilisez une variablepour créer l'actionnonce ou lenomnonce. Étant donné que
get_template_part()
inclut lefichiermodèle dans laportée de cettefonction,iln'estplusexécuté dans le cadre du rappel d'affichage de votrepage d'administration. Vous devez soitglobaliser ces variables àtous lesemplacements,soit utiliser des constantes au lieu de variables.I know you say it's not a nonce issue, but it clearly is. That notice is the default 'This nonce didn't check out' message. I don't know exactly why the nonce is failing, but that is what is happening.
I would double check how your nonces are created and checked. If you're using
wp_nonce_field()
make sure both action values and argument values are the same. Also, double check spelling of variables, or any scope-related issues that could be causing the nonce to fail.EDIT
Following up on your insistence that it's not a nonce issue (which it is. The nonce issue is caused by a scope issue), here's what's probably happened. Included/required files are executed in the scope in which they're included. My guess is you're using a variable to build either the nonce action or the nonce name. Because
get_template_part()
includes the template file in the scope of that function, it's no longer being executed in the scope of your admin page's display callback. You either need to globalize those variables in all locations, or you need to use constants instead of variables.-
Noncesfonctionnebien lorsque le coden'estpas segmenté avecget_template_part,donc s'il s'agit d'unproblèmenonce,pourquoi celafonctionne-t-il lorsque vousn'utilisezpasget_template_part?Deplus,lenonceest crééet visible dans la vue sourceNonces work fine when the code is not segmented with get_template_part so if it's a nonce issue why is it working when not using get_template_part? Also, the nonce is created and visible in view source
- 0
- 2010-11-10
- Ashley G
-
Commeje l'ai dit,c'estprobablement lié à laportée.Modification ajoutée ci-dessus.Like I said, it's probably scope related. Edit added above.
- 0
- 2010-11-10
- John P Bloch
-
@John P Bloch - celapeuten être uneexplication.Maisen fin de compte,cela conduit àne pas utiliser cettefonctionpourinclure votre code.Cen'esttout simplementpas unmodèle,c'est du code.Donc,lamauvaisefonctionest utilisée.Maisbonneprise,celapeut vraiment être l'explication.@John P Bloch - that can be an explanation of it. But in the end this leads to not using that function to include your code. It's just not a template, it's code. So the wrong function is used. But good catch, this can really be the explanation.
- 0
- 2010-11-10
- hakre
-
@hakre Jepense que c'estimbécile d'insisterpour qu'iln'utilisepas cettefonctionpour l'administrateur.Peut-être qu'il construit un cadre qui a une certainepage d'administration que lesthèmesenfants devraientpouvoir remplacer.Lefaitest que le cas d'utilisation doit dicter l'utilisation,et non votre stupide déclaration de ségrégation de l'avantet de l'arrière.@hakre I think it's imbecilic to insist that he not use this function for the admin. Maybe he's building a framework that has a certain admin page that child themes should be able to override. The point is, the use case should dictate the use, not your silly declaration of segregation of front and back end.
- 0
- 2010-11-10
- John P Bloch
-
@John P Bloch - Je vous demandepardon.Jene revendiquepas lapaternité de la différenciationentre ce qu'on appelle wp-adminet ce qu'on appelle unthème ou unmodèle.Si vousme ditesidiot,vous vous adressez à lamauvaisepersonne.Jene voulaispasnonplus remettreen question ce qu'Ashessaie de réaliser,je voulaisjuste souligner que l'utilisation de cettefonctionest à l'origine duproblèmeet vous avezfourni uneexplicationtechnique de ce quipourrait causer leproblème.Rien d'autre.Enpratique,celapourrait simplement signifier dene pas utiliser cettefonction ou deglobaliser laportée dans ce code.Tout ce qui semble convenir.Choisissez simplement lebon outilpour letravail.@John P Bloch - I beg your pardon. I do not claim the authorship of differentation between what is called wp-admin and what is called a theme or template. If you call that silly to me, you're addressing the wrong person. I also didn't wanted to question what Ash is trying to achieve, I just wanted to point out that using that function is causing the issue and you provided a technical explanation for what might cause the issue. Nothing else. Practically it might just mean to not use that function or to globalize scope within that code. Whatever seem fit. Just choose the right tool for the job.
- 0
- 2010-11-10
- hakre
-
@John P Bloch,je vois ce que vous voulez dire àpropos de laportée,et jepense que vous avez raison,c'estprobablement leproblèmeici.@hakre Jene voisnullepart dans le codex où le concept demodèleest défini comme une chosefrontale.Et àpart ceproblème,mon utilisation deget_template_part a été sansproblèmeet j'enfais un usageintensif à lafoisen frontet enbackendpourpermettre auxthèmesenfants unmoyenfacile de remplacer.@John P Bloch, I see what you mean about scope, and I think your right, that is likely the issue here. @hakre I don't see anywhere in the codex where the concept of a template is defined as a front end thing. And aside from this one issue my usage of get_template_part has been trouble free and I make heavy use of it in both front and backend to allow child themes an easy way to override.
- 0
- 2010-11-11
- Ashley G
-
@Ash G -templateestpar définition lethème dublog quin'estpas utilisé dans l'admin.Maisje n'aimepas discuter de celaen détailparce que cen'est que le concept.Si les chosesfonctionnent autrement,c'estprobablementnormal àmoins que quelque chosene casse (comme lenonce dans votre cas).Pourbénéficier dufichier de localisation de stragtegy dans lesthèmesparents/enfants de wordpress,j'aimis àjourma réponsepour cela.C'estpeut-être utile.@Ash G - template is per definition the blog theme which is not used in the admin. But I don't like to argue over this in detail because it's just the concept. If things work other ways, it's probably okay unless something breaks (like the nonce in you case). To benefit from the file locating stragtegy in wordpress parent/child themes, I updated my answer for that. Maybe that's helpful.
- 0
- 2010-11-16
- hakre
-
- 2010-11-09
Veuillezne pas utiliserget_template_part () dans Admin/Backend. Il a été conçupour être utilisé avec unmodèle (affichant lethème,veuillez consulter codex ),donc c'estprévu à utiliserpour lesmodèleset les éléments demodèle dans lesthèmes:
Référence desfonctions/obtenir unepartie dumodèle
Charger un élément demodèle dans unmodèle (autre que l'en-tête,labarre latérale,lepied depage). Facilite la réutilisation d'unthème sections de code dans une surchargepour lesthèmesenfants.
Lafonctioninclut également du code sourcegénéral,mais ce que vous ressentez (comme l'a souligné John)peut être lié à laportée. Commeje ne connaispas votre code,je nepeuxpas dire avec certitude,si c'est la causeexacte duproblème auquel vous êtes confronté (portée variable),j'ai donctendance à rester simple dansma réponse:
Lafonctionn'esttout simplementpas conçuepour être remplacéeen tant que code PHP standard,parexemplepour écrire unepage d'administration.
Ne l'utilisez doncpaspour votrepage d'administration àmoins que vousne sachiez vraiment ce que vousfaites.
<₹Update:
Si vous souhaitez charger unfichierphp dans laportéeglobaletouten regardant dans le répertoire duthèmeenfantet parent,vouspouvez utiliser unefonction qui recherche lefichierpour vous: Locate_template () :
Récupérez lenom dufichier demodèle depriorité laplus élevée quiexiste.
Recherche dans STYLESHEETPATH avant TEMPLATEPATH afin que lesthèmes qui héritent d'unthèmeparentne puissent surcharger qu'un seulfichier.
Pour votreexemple donné,incluez
include(TEMPLATEPATH."sitewideSettings.php");
celapeut être écrit comme suit:include(locate_template('sitewideSettings.php'));
Cela vouspermet de contrôler oùet comment lefichierestinclus (include/_once; require/_cone)et cela vousempêche d'avoir leproblème deportée dans votreexemple qui rompt lemécanisme NONCE.
/p>
Lemessage "Veuillez réessayer"estprésent car wp-adminn'estpasen mesure de vérifier la demande,plusprécisément le soi-disant nonce . Ilpeut y avoir deux raisons à cela:iln'yen apas dans la demande (parexemple,leformulairen'enfournitpas ouiln'estpastransféré ou lupar le code administrateur) ou lenonceestinvalide. Lesnonces représententtoujours une chaîne d'actions,et si cette chaîneest rompue,vous recevrez cemessage. Mais lemessagene vous ditpas où cette chaîneest rompue.
Cesmessages d'erreur dans l'administrationne sontpastoujourstrèsinformatifset peuventmême êtretrompeurs (Connexes: # 14060 ). Pour savoir ce qui sepasseici,ilestplusefficace de le déboguer sur le système où l'erreur apparaît carilpeut être assez spécifique de savoir quellepartie de la chaîneest cassée.
Veuillez consulter le codex sur lafaçon de créer despages d'administrationpour votrethème ou votrepluginpour desinformationsplus détaillées sur lesnonces,lespages d'administration,etc. Iln'estpaspossiblepour la demande de l'administrateur de valider lenoncepour une raison quelconque.
Please do not use get_template_part() in the Admin / Backend. It has been designed for template use (displaying the theme, please see codex), so this is intended to be used for templates and template-parts within themes:
Function Reference/get template part
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.
Please see the codex on how to create Admin Pages for your Theme or Plugin for more in-depth information about nonces, admin pages etc. . It's not possible for the Admin request to validate the nonce for some reason.
-
Salut Hakre,j'ai lu le codexet jene vois aucunemention de son utilisation limitée aufrontal.Unnonceest crééen fait,et peutmême être visualisé dans `` voir la source '',doncencore unefoisje dis quenoncen'estpas unproblème ou si c'est le cas,je ne comprendspas comment (ce quiesttrèspossibleet probablementplusprobable)je suisbien conscient decomment créer despages d'administration Je les crée depuis des annéeset jusqu'àprésentje n'aijamaiseu deproblème.Hi Hakre, I have read the codex and I do not see any mention of it being restricted for use to the front end. A nonce is created in fact, and can even be viewed in 'view source' so again I say nonce is not an issue or if it is I do not understand how (which is very possible and probably more likely) I am well aware of how to create admin pages I have been creating them for years and until now have never had a problem.
- 0
- 2010-11-10
- Ashley G
-
@Ash G - Ehbien,nonce * doit * être unproblèmebasé sur lemessage d'erreur qui s'affiche après l'envoi duformulaire.Peut-êtrepas lagénérationmais la vérification de celle-ci?Oh,ehbien il y a d'autres raisons à cemessage,je m'en souviensmaintenant.Si lapagen'estpas correctementenregistrée,celapeut également arriver.Celapeut donc devenir assez spécifique.Pourget_template_part (),ilne s'agit que d'unefonction dethème,et àmameilleure connaissance,utilisez-la uniquement sur lapage d'accueil.Jepense que votre variante d'inclusionfonctionneparfaitementet jene vois aucune raison de changer cela.Mais celane supprimepas l'erreur,non?@Ash G - Well nonce *must* be an issue based on the error message that get's displayed after submitting the form. Maybe not the generation but the verification of it? Oh, well there are other reasons for that message, I remember it now. If the page is not properly registerd, this can happen as well. So this can become quite specific. For the get_template_part() this is just a theme function, and to my best knowledge, just use it on frontpage only. I think your include variant is perfectly working and I do not see any reason why to change that. But it does not remove the error, right?
- 0
- 2010-11-10
- hakre
-
Inclure supprimeen fait l'erreur,l'erreur * uniquement * seproduit lors de l'utilisation du composantget template.Dans les deux cas,lors de la visualisation du code source de lapagegénérée,tout apparaît de lamêmemanièrejusqu'aunonce.Include does in fact remove the error, the error *only* happens when using get template part. In either case when viewing source code of the generated page everything appears the same right down to the nonce.
- 0
- 2010-11-10
- Ashley G
-
Voirma réponsemise àjour.C'est unproblème deportée qui cause l'échec dunonce.See my updated answer. It's a scope issue causing the nonce failure.
- 0
- 2010-11-10
- John P Bloch
-
@Ash G - vient de vérifier ànouveau le codex.Onne parlepas de restriction,mais laportéeest lemodèle (pas lebackend): "Charger unepartie demodèle dans unmodèle".http://codex.wordpress.org/Function_Reference/get_template_part@Ash G - just checked codex again. It's not talked about restriction, but the scope is template (not backend): "Load a template part into a template". http://codex.wordpress.org/Function_Reference/get_template_part
- 0
- 2010-11-10
- hakre
-
C'est une directivepour lespersonnes quine saventprobablementpas ce qu'est unnonce.Celane s'appliquepas dans le cas d'Ash.That's a guideline for people who probably don't know what a nonce is. It doesn't apply in Ash's case.
- 0
- 2010-11-10
- John P Bloch
-
- 2010-09-14
Difficile de deviner,c'esttoute une échelle defonctions.
get_template_part()
appellelocate_template()
qui appelleload_template()
ce quirequire
.Je vous suggère de lesessayer debasen hautpour déterminer s'il s'agitexactement de
get_template_part()
ou d'unefonctionintermédiaire.Hard to make a guess, it's whole ladder of functions.
get_template_part()
callslocate_template()
which callsload_template()
which doesrequire
.I suggest you try these from bottom to top to determine if it is
get_template_part()
exactly or some function in between.-
Salut Rast,j'ai regardé çamaisje n'ai rien vu quipuisse l'expliquer.Je suppose quej'aibesoin de creuser ànouveau.Ça doit être là.Hi Rast, I did look through that but saw nothing that could explain it. Guess I need to dig through again. It's gotta be there.
- 0
- 2010-09-14
- Ashley G
-
Essayez simplement de charger votrefichier avec `load_template ()`et `Locate_template ()`,voyez si celafait une différence.Si quelque chose sebrise dans l'une de cesfonctions,ilfaut d'abord savoir laquelleest-ce.Just try loading your file with `load_template()` and `locate_template()`, see if it makes a difference. If something breaks in one of these functions first need to know which one is it.
- 0
- 2010-09-14
- Rarst
-
Aprèsbeaucoup defouilles,toujourspas d'indices sur ce quine vapas,maisje soupçonne que cela a quelque chose à voir avec desnoncesAfter much digging, still no clues as to exactly what is going wrong, but I suspect it has something to do with nonces
- 0
- 2010-09-28
- Ashley G
-
Gérépour le contourneren utilisant simplement requirepour lesbits demodèle qui ont à voir avec l'enregistrement.Celafonctionnebien,jusqu'à ce quej'essaye de créer unthèmeenfant.Lethèmeenfant hérite detoutmaisn'enregistrepas les options.Il semble que vousne pouveztout simplementpas utiliserget_template_part sur lebackendManaged to get around it by simply using require for the template bits that have to do with saving. That works fine, until I tried creating a child theme. The child theme inherits everything but will not save options. Looks like you just can't use get_template_part on the backend
- 0
- 2010-10-18
- Ashley G
-
ignorer ci-dessus.Unmoment de stupidité ...ma stupidité unespace supplémentaire dans lenom duthème dans lafeuille de style causait leproblèmedisregard above. A moment of stupidity... my stupidity an extra space in the theme name in the style sheet was causing the problem
- 1
- 2010-10-18
- Ashley G
-
@Ash: Si leproblème s'est avéré être unnon-problème,vouspourriezpeut-être supprimer la question,afin qu'elle soit supprimée de la liste des questions "sans réponse".@Ash: If the problem turned out to be a non-problem, maybe you could delete the question, so it is removed from the list of "unanswered" questions.
- 0
- 2010-11-05
- Jan Fabry
-
@Jan,seulsmes commentaires ci-dessus commençantpar ``j'ai réussi à le contourner ''n'étaientpas unproblème,leproblème originalposté subsiste.@Jan, only my comments above starting with 'managed to get around it' were a non problem, the original posted problem still stands.
- 0
- 2010-11-06
- Ashley G
-
-
Salut,Mercipour la réponse,maispouvez-vousfournir un contexte?Dois-je l'utiliser avecget_template_part () ou à laplace de?Hi, Thanks for the answer, but can you provide some context? Should I use this with get_template_part() or in place of?
- 0
- 2010-10-15
- Ashley G
-
Enfait,cette réponsen'estpas simauvaise.Comme Ash a spécifié d'utiliserinclude (etnon require),c'est une alternative: `include Locate_template ('sitewideSettings.php');` - la conversionen tableaun'estpasnécessaire.Cela localisera lefichierphp avec une vérification d'abord dans le répertoire duthèmeenfant,puis dans lethèmeparenttouten gardant le contrôle de laportéeet dutype d'inclusion (inclure au lieu de require/_once).Infact that answer isn't that bad. As Ash specified to use include (and not require), this is an alternative: `include locate_template('sitewideSettings.php');` - the conversion to array is not necessary. This will locate the php file with a check first in the child theme directory and then in the parent theme while being still in control of the scope and the type of inclusion (include instead of require/_once).
- 0
- 2010-11-16
- hakre
-
-
- 2012-02-08
Ceciest uneexplicationplus détaillée de lapremière réponse - c'est-à-dire "laportéeest votreproblème"
Ma simple visualisation deget_template_partest comme ceci:
function get_template_part($slug) { require("$slug.php"); }
Donc,si vous avez ce qui suit dans sitewideSettings.php:
<?php echo $nonce; ?>
Modèle avecinclure:
<?php $nonce = 'xxx'; include('sitewideSettings.php'); ?>
Setraduit (par PHP)en:
<?php $nonce = 'xxx'; echo $nonce; ?>
Modèle avecget_template_part:
<?php $nonce = 'xxx'; get_template_part('sitewideSettings'); ?>
Setraduiten:
<?php $nonce = 'xxx'; get_template_part( echo $nonce; ); ?>
Alorsmaintenant,tout ce qui setrouve dans lapartiemodèleestenveloppé dans unefonctionet toutes les variables que vous avez dans votrepartiemodèle ontbesoin d'un
global
dessus.Ainsi,pour que celafonctionne,vous avezbesoin d'un
global
dans le sitewideSettings.php,qui seraittraduiten:<?php $nonce = 'xxx'; get_template_part( global $nonce; echo $nonce; ); ?>
This is a more detailed explanation of the first answer - i.e. "scope is you're problem"
My simple visualisation of get_template_part is like this:
function get_template_part($slug) { require("$slug.php"); }
So if you have the following in sitewideSettings.php:
<?php echo $nonce; ?>
Template with include:
<?php $nonce = 'xxx'; include('sitewideSettings.php'); ?>
Gets translated (by PHP) into:
<?php $nonce = 'xxx'; echo $nonce; ?>
Template with get_template_part:
<?php $nonce = 'xxx'; get_template_part('sitewideSettings'); ?>
Gets translated into:
<?php $nonce = 'xxx'; get_template_part( echo $nonce; ); ?>
So now anything in the template part is wrapped inside a function and any variables you have in your template part need a
global
on them.Thus to get it to work you need a
global
in the sitewideSettings.php, which would get translated into:<?php $nonce = 'xxx'; get_template_part( global $nonce; echo $nonce; ); ?>
J'ai rencontré unproblèmeintéressant concernant
get_template_part()
.J'ai créé unepage d'options dethème (nommée sitewideSettings.php)
normalement,j'inclurais ceci dansfunctions.php comme ceci:
quifonctionnebien.
Maismaintenant,j'essaye d'utiliser
get_template_part();
quifonctionne égalementtrèsbien,sauf que lorsqueje clique sur "mettre àjour"pourmettre àjour lesparamètres,j'obtiens unmessage d'erreur: "Êtes-vous sûr de vouloirfaire cela? Veuillez réessayer".
"Veuillez réessayer" renvoie à lapage des options dethèmeet en cliquant sur Mettre àjour vous ramène aumessage d'erreur qui vous ramène aux options dethèmeet en rond.
Rien d'autren'a changé àpart l'utilisation de
get_template_part();
Quelqu'un d'autre a rencontré ceproblème? Comment l'avez-vous contourné? Je suis sûr que c'est quelque chose de simpleet d'évident,mais ce que c'estexactementm'échappetotalement.
(Cen'estpas unproblèmenonce car unnonceest créé dans les deux cas)