Je me retrouve à devoir transmettre des données personnalisées à un filtre fourni par un plugin tiers. Toutes les façons dont j'ai vu cela sont vraiment compliquées et difficiles à comprendre.
Prenez cet exemple:
$score = 42; //Some crazy calculation I don't want to repeat.
function add_score_to_title($title) {
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
Comment passer la $score
variable à add_score_to_title()
?
J'ai fini par ajouter ma variable à l' $wp
objet global . Vous vous retrouvez donc avec ceci:
global $wp;
$score = 42; //Some crazy calculation I don't want to repeat.
$wp->some_random_name_for_score = $score;
function add_score_to_title($title) {
global $wp;
$score = $wp->some_random_name_for_score;
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
Sale? Peut être. Facile? Ouaip! Des inconvénients à cette technique? Débattez s'il vous plaît.
MISE À JOUR Voici le code complet en question -> http://pastebin.com/fkSXY04m
$score
est calculé en bouclant sur un tableau de choses et en incrémentant une variable. pastebin.com/fkSXY04mRéponses:
Vous avez au moins deux options:
Globaliser la variable
Envelopper le calcul du score
Si vous n'avez besoin que du calcul du score à l' intérieur du filtre, insérez la logique dans le rappel lui-même:
Mieux encore, vous pouvez encapsuler votre calcul de score dans une fonction qui lui est propre, puis appeler cette fonction dans votre rappel:
Si vous trouvez que vous rencontrez des problèmes pour référencer l'
$_POST
objet, vous pouvez également enregistrer votre variable de requête, puis l'utiliser enget_query_var()
interne pour obtenir des données:Avec cela en place,
$_POST['Q']
peut être remplacé parget_query_var('Q')
.la source
$score
abord calculé puis mondialisé. Pas étonnant que cela ne fonctionne pas. Je vous remercie!Appelez la fonction n'importe où dans votre script pour obtenir le score, il ne sera calculé qu'une seule fois.
Une autre façon, en utilisant des fonctions anonymes :
la source
add_filter()
ou lesadd_action()
appels. Ils ne peuvent pas être supprimés viaremove_function()
.remove_filter()
etremove_action()
. Et il n'y a aucune raison pour que les filtres de plugin / thème ne puissent raisonnablement pas être supprimés: remplacer les files d'attente de feuilles de style de plugin, les thèmes enfants, etc.L'exemple suivant voit la variable
$my_calculation
dans la portée globale, mais à partir de notre fonction locale, nous devons déclarerglobal $my_calculation
afin d'accéder à la variable dans la portée globale.Ce n'est qu'une façon de procéder et cela semble être net. Est-ce que cela fonctionnerait pour vous?
la source
print
ouecho
votre résultat vous assurer que votre fonction fonctionne bien avant de la passer au filtre?$score
fonctionne effectivement. J'ai gaffé et mis en$score
premier puis mondialisé, ce qui ne fonctionne clairement pas. Le faire correctement en globalisant d'$score
abord puis en lui donnant une valeur fonctionne comme prévu. Merci a tous.