web-dev-qa-db-fra.com

Erreur de soumission de formulaire avec get_template_part ()

J'ai rencontré un problème intéressant concernant la get_template_part().

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

normalement, je l'inclurais dans functions.php comme ceci:

include(TEMPLATEPATH."sitewideSettings.php");

qui fonctionne bien.

Mais maintenant, j'essaie d'utiliser get_template_part();

get_template_part('sitewideSettings');

qui fonctionne aussi très bien, sauf que lorsque je clique sur "mettre à jour" pour mettre à jour les paramètres, un message d'erreur apparaît: "Êtes-vous sûr de vouloir le faire? Veuillez réessayer".

"Veuillez réessayer" renvoie à la page des options de thème et cliquer sur mettre à jour vous ramène au message d'erreur qui vous ramène aux options de thème et qui continue.

Rien d'autre n'a changé à part l'utilisation de get_template_part();

Quelqu'un d'autre a rencontré ce problème? Comment t'es-tu débrouillé? Je suis sûr que c'est quelque chose de simple et évident, mais exactement ce que c'est m'échappe totalement.

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

6
Ashley G

Je sais que vous dites que ce n'est pas un problème de nonce, mais c'est clairement le cas. Cette notification est le message par défaut "Ce nonce n'a pas été vérifié". 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 identiques. Vérifiez également l'orthographe des variables ou de tout problème lié à la portée qui pourrait entraîner l'échec de la nonce.

MODIFIER

Pour faire suite à votre insistance selon laquelle il ne s’agit pas d’un problème de nonce (ce qui est le cas. Le problème de nonce est causé par un problème de portée), voici ce qui est probablement arrivé. Les fichiers inclus/requis sont exécutés dans la portée dans laquelle ils sont inclus. J'imagine que vous utilisez une variable pour créer l'action nonce ou le nom de nonce. Étant donné que get_template_part() inclut le fichier modèle dans la portée de cette fonction, il n'est plus exécuté dans la portée du rappel à l'écran de votre page d'administration. Vous devez soit globaliser ces variables dans tous les emplacements, soit utiliser des constantes au lieu de variables.

6
John P Bloch

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

Référence de fonction/obtenir une partie de modèle

Chargez un élément de modèle dans un modèle (autre que l'en-tête, la barre latérale, le pied de page). Permet à un thème de réutiliser facilement des sections de code de manière à surcharger facilement les thèmes enfants.

En fait, la fonction inclut également le code source général, mais ce que vous rencontrez (comme John l'a souligné) peut être lié à la portée. Comme je ne connais pas votre code, je ne peux pas vous dire avec certitude si c'est la cause exacte du problème que vous rencontrez (portée variable), alors j'ai tendance à rester simple dans ma réponse:

La fonction n’est tout simplement pas conçue pour remplacer l’inclusion de code php standard, par exemple pour écrire une page d’administrateur.

Il suffit donc de ne pas l'utiliser si, pour votre page d'administration, vous savez vraiment ce que vous faites.


Mise à jour:

Si vous souhaitez charger un fichier php dans la portée globale tout en cherchant dans le répertoire du thème enfant et parent, vous pouvez utiliser une fonction qui effectue la recherche du fichier pour vous: Locate_template () :

Récupérez le nom du fichier modèle existant ayant la priorité la plus élevée.

Recherche dans STYLESHEETPATH ​​avant TEMPLATEPATH afin que les thèmes hérités d'un thème parent puissent simplement surcharger un fichier.

Pour votre exemple donné, inclure include(TEMPLATEPATH."sitewideSettings.php");, cela peut être écrit comme suit:

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

Cela vous permet de contrôler où et comment le fichier est inclus (include/_once; require/_cone) et vous empêche d'avoir le problème de portée dans votre exemple qui rompt le mécanisme NONCE.


Le message "Veuillez réessayer" existe, car wp-admin n'est pas en mesure de vérifier la demande, plus précisément ce que l'on appelle nonce . Il peut y avoir deux raisons à cela: il n'y en a aucune dans la demande (par exemple, le formulaire n'en fournit pas ou il n'est pas transféré ou lu par le code administrateur) ou le nonce est invalide. Les nonces représentent toujours une chaîne d'actions, et si cette chaîne est rompue, vous recevrez ce message. Mais le message ne vous dit pas où cette chaîne est brisée.

Ces messages d'erreur dans l'administrateur ne sont pas toujours très instructifs et peuvent même être trompeurs (Connexe: # 14060 ). Pour savoir ce qui se passe ici, il est plus efficace de déboguer sur le système où l'erreur apparaît, car il peut être très spécifique de savoir quelle partie de la chaîne est cassée.

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

4
hakre

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

0
zeo

Ceci est une explication plus détaillée de la première réponse - c'est-à-dire "la portée est votre problème"

Ma visualisation simple de get_template_part est la suivante:

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

Donc, si vous avez les éléments suivants dans sitewideSettings.php:

<?php
echo $nonce;
?>

Modèle avec include:

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

Se traduit (par PHP) en:

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

Modèle avec get_template_part:

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

Se traduit en:

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

Alors maintenant, tout ce qui est dans la partie modèle est encapsulé dans une fonction et toutes les variables que vous avez dans votre partie modèle nécessitent une global.

Ainsi, pour que cela fonctionne, vous avez besoin d'une globaldans le sitewideSettings.php, qui serait traduite en:

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

Difficile à 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 de get_template_part() exactement ou d’une fonction intermédiaire.

0
Rarst