Fehler beim Senden von Formularen mit get_template_part ()

Ich bin auf ein interessantes Problem bezüglich get_template_part() .

Ich habe eine Seite mit Themenoptionen (namens sitewideSettings.php) erstellt.

normalerweise würde ich dies in functions.php wie folgt einschließen:

 include(TEMPLATEPATH."sitewideSettings.php"); 

das funktioniert gut.

Aber jetzt versuche ich get_template_part();

 get_template_part('sitewideSettings'); 

Das funktioniert auch gut, außer dass, wenn ich auf ‘update’ klicke, um die Einstellungen zu aktualisieren, eine Fehlermeldung erscheint: “Bist du sicher, dass du das machen willst? Bitte versuche es erneut”.

“Bitte versuchen Sie es noch einmal” führt Sie zurück zur Seite mit den Themenoptionen. Wenn Sie auf “Aktualisieren” klicken, kehren Sie zu der Fehlermeldung zurück, die Sie zu den Themenoptionen zurückbringt.

Nichts anderes hat sich geändert als die Verwendung von get_template_part();

Ist noch jemand auf dieses Problem gestoßen? Wie bist du dazu gekommen? Ich bin mir sicher, dass es etwas Einfaches und Offensichtliches ist, aber genau das, was es ist, entgeht mir völlig.

(Es ist kein Nonce-Problem, da eine Nonce in beiden Fällen erstellt wird)

Solutions Collecting From Web of "Fehler beim Senden von Formularen mit get_template_part ()"

Ich weiß, Sie sagen, es ist kein Nonce-Problem, aber es ist eindeutig. Diese Benachrichtigung ist die Standardnachricht “Diese Nonce hat nicht ausgecheckt”. Ich weiß nicht genau, warum die Nonce versagt, aber genau das passiert.

Ich würde überprüfen, wie Ihre Nonces erstellt und überprüft werden. Wenn Sie wp_nonce_field() , vergewissern Sie sich, dass sowohl die Aktionswerte als auch die Argumentwerte identisch sind. Überprüfen Sie außerdem die Schreibweise von Variablen oder alle bereichsbezogenen Probleme, die das Fehlschlagen der Nonce verursachen könnten.

BEARBEITEN

Wenn Sie darauf bestehen, dass es kein Nonce-Problem ist (was es ist. Das Nonce-Problem wird durch ein Scope-Problem verursacht), ist hier Folgendes passiert. Enthaltene / benötigte Dateien werden in dem scope ausgeführt, in dem sie enthalten sind. Meine Vermutung ist, dass Sie eine Variable verwenden, um entweder die Nonce-Aktion oder den Nonce-Namen zu erstellen. Da get_template_part() die Vorlagendatei in den Gültigkeitsbereich dieser function get_template_part() , wird sie nicht mehr im Bereich des Display-Callbacks Ihrer Verwaltungsseite ausgeführt. Sie müssen diese Variablen entweder an allen Standorten globalisieren oder Sie müssen anstelle von Variablen Konstanten verwenden.

Bitte benutze get_template_part () nicht im Admin / Backend. Es wurde für die Verwendung von Vorlagen entworfen (Anzeige des Themas, siehe Codex ), so dass dies für Vorlagen und Template-Teile innerhalb von Themes verwendet werden soll:

functionsreferenz / Get Schablonenteil

Laden Sie einen Schablonenteil in eine Vorlage (außer Kopfzeile, Seitenleiste, Fußzeile). Erleichtert die Wiederverwendung von Codeabschnitten in leicht zu überladender Weise für untergeordnete Themen.

Die function enthält tatsächlich auch allgemeinen Quellcode, aber was Sie erleben (wie John hervorhebt) könnte mit dem scope zusammenhängen. Da ich Ihren Code nicht kenne, kann ich nicht mit Sicherheit sagen, ob dies der genaue Grund für das Problem ist, dem Sie gegenüberstehen (variabler Gültigkeitsbereich), daher tendiere ich dazu, es in meiner Antwort einfach zu halten:

Die function ist einfach nicht dazu gedacht, sie als Standard PHP Code Include zu ersetzen, zB um eine Admin Seite zu schreiben.

Benutze es also nicht für deine Admin-Seite, es sei denn, du weißt wirklich, was du tust.


Aktualisieren:

Wenn Sie eine php-Datei in den globalen Bereich laden möchten, während Sie im Themen-Verzeichnis child und parent nachsehen , können Sie eine function verwenden, die nach der Datei für Sie sucht : locate_template () :

Rufen Sie den Namen der Vorlagendatei mit der höchsten Priorität ab, die vorhanden ist.

Sucht in STYLESHEETPATH ​​vor TEMPLATEPATH, sodass Themen, die von einem übergeordneten Thema erben, nur eine Datei überladen können.

Für Ihr gegebenes Beispiel include include(TEMPLATEPATH."sitewideSettings.php"); Dies kann geschrieben werden als:

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

Auf diese Weise können Sie steuern, wo und wie die Datei enthalten ist (include / _once; require / _cone), und Sie verhindern, dass in Ihrem Beispiel das Problem mit dem Gültigkeitsbereich auftritt, wodurch der NONCE-Mechanismus durchbrochen wird.


Die Meldung “Bitte erneut versuchen” ist da, weil wp-admin nicht in der Lage ist, die Anfrage zu überprüfen, genauer gesagt, die sogenannte Nonce . Das kann zwei Gründe haben: Es gibt keine in der Anfrage (zB das Formular liefert keine oder es wird nicht vom Admin-Code übertragen oder gelesen) oder die Nonce ist ungültig. Nonces repräsentieren immer eine Kette von Aktionen, und wenn diese Kette unterbrochen ist, erhalten Sie diese Nachricht. Aber die Nachricht sagt Ihnen nicht, wo diese Kette unterbrochen ist.

Diese Fehlermeldungen im Admin sind nicht immer sehr informativ und können sogar irreführend sein (Related: # 14060 ). Um herauszufinden, was hier passiert, ist es am effektivsten, das auf dem System zu debuggen, bei dem der Fehler auftritt, da es ziemlich genau sein kann, welcher Teil der Kette unterbrochen ist.

Im Codex erfahren Sie, wie Sie Admin-Seiten für Ihr Theme oder Plugin erstellen, um ausführlichere Informationen zu Nonces, Admin-Seiten usw. zu erhalten. Es ist nicht möglich, dass die Admin-Anfrage die Nonce aus irgendeinem Grund validiert.

Schwer zu raten, es ist eine ganze Leiter von functionen. get_template_part() ruft locate_template() welches load_template() was require .

Ich schlage vor, Sie versuchen diese von unten nach oben, um festzustellen, ob es get_template_part() genau oder eine function dazwischen ist.

locate_template( array( 'sitewideSettings.php' ), true )

Dies ist eine detailliertere Erklärung der ersten Antwort – dh “Scope ist dein Problem”

Meine einfache Visualisierung von get_template_part ist wie folgt:

 function get_template_part($slug) { require("$slug.php"); } 

Also wenn du folgendes in sitewideSettings.php hast:

 < ?php echo $nonce; ?> 

Vorlage mit enthalten:

 < ?php $nonce = 'xxx'; include('sitewideSettings.php'); ?> 

Wird übersetzt (von PHP) in:

 < ?php $nonce = 'xxx'; echo $nonce; ?> 

Vorlage mit get_template_part:

 < ?php $nonce = 'xxx'; get_template_part('sitewideSettings'); ?> 

Wird übersetzt in:

 < ?php $nonce = 'xxx'; get_template_part( echo $nonce; ); ?> 

Nun wird alles im Template-Teil in eine function eingeschlossen und alle Variablen, die Sie in Ihrem Template-Teil haben, benötigen eine global Angabe.

Um es zum Laufen zu bringen, benötigen Sie ein global in der sitewideSettings.php, das übersetzt werden sollte in:

 < ?php $nonce = 'xxx'; get_template_part( global $nonce; echo $nonce; ); ?>