J'essaie de comprendre quand et pourquoi utiliser la variable globale $ post. J'ai essayé de faire ce qui suit sur une page de publication, en dehors de la boucle, et comme prévu, cela fonctionne.
<?php
global $post;
echo $post->ID;
?>
Si je fais la même chose sur une page d'archive (je voulais juste voir ce qui se passe), pour une raison quelconque, cela fonctionne également, en récupérant l'ID du précédent message, même si j'ai supprimé le code ci-dessus de la page précédente. Est-ce que c'est comme une sorte de cache? Comment ça marche exactement?
Je comprends que global $ post peut être utile si je travaille sur une fonction dans functions.php. Est-ce le seul cas d'utilisation?
Merci beaucoup
C'est peut-être une question trop vaste pour bien répondre. Le $post
global pourrait être utilisé de toutes sortes de façons. Que ce soit utilisé ou non {devrait} _ dépend de chaque circonstance.
Cependant, si je comprends bien, le but principal de du $post
global est son utilisation dans les fichiers de modèle de thème.
Lorsque vous utilisez the_title()
ou the_content()
ou the_author()
ou l'une des nombreuses fonctions de modèle, WordPress recherche ces informations dans le $post
global. En règle générale, lorsque vous travaillez dans les fichiers de modèle, vous souhaiterez toujours utiliser ces fonctions de modèle, telles que get_the_ID()
, au lieu d'accéder directement à $post->ID
.
Donc, si vous voulez mieux comprendre le $post
global, vous devriez vous renseigner sur le fonctionnement de The Loop dans WordPress, en particulier dans les fichiers de modèle. Lorsqu'une boucle exécute the_post()
, elle configure la globale avec l'élément en cours.
Dans les fichiers de modèle, vous effectuerez généralement une itération sur une boucle pour une requête exécutée automatiquement. Par exemple, lorsque vous accédez à une seule page, WordPress sait exécuter une requête pour cette page et charger le modèle page.php
.
Si vous souhaitez récupérer des publications supplémentaires en dehors de la boucle principale, par exemple dans votre functions.php
, vous devez exécuter votre propre WP_Query , lancer la boucle, puis utiliser les fonctions de modèle. Accédez au $post
global directement uniquement si vous ne parvenez pas à accéder aux informations souhaitées par le biais d’une fonction existante.
Lorsque vous avez terminé la boucle sur votre propre WP_Query
, vous constaterez que le $post
global est maintenant bloqué sur votre requête personnalisée. Ainsi, par exemple, sur notre modèle de page unique, après notre boucle personnalisée, il est possible que la page actuelle ne soit plus configurée dans $post
. Vous pouvez restaurer le $post
global à son état antérieur avec wp_reset_query . Ceci est absolument critique ou vous pouvez casser d’autres plugins ou thèmes qui attendent le $post
global d’origine.
J'ai écrit un ou deux articles sur ce sujet qui manquaient peut-être d'informations car cette question aborde d'autres problèmes. J'ai également posé une question que vous pouvez vérifier ici avec une excellente réponse de @ G.M.
Fondamentalement, le $post
global est défini par $wp_query->the_post()
et est accessible dans tout le modèle, pas seulement dans la boucle. C'est pourquoi on les appelle globals
Voici la source actuelle
3681 public function the_post() {
3682 global $post;
3683 $this->in_the_loop = true;
3684
3685 if ( $this->current_post == -1 ) // loop has just started
3686 /**
3687 * Fires once the loop is started.
3688 *
3689 * @since 2.0.0
3690 *
3691 * @param WP_Query &$this The WP_Query instance (passed by reference).
3692 */
3693 do_action_ref_array( 'loop_start', array( &$this ) );
3694
3695 $post = $this->next_post();
3696 setup_postdata($post);
3697 }
3698
Vous obtenez également la réponse à votre question sur la raison pour laquelle vous obtenez le dernier message en tant que $post
dans la page d'archive (et d'ailleurs, n'importe quelle page). $post
est toujours effectivement défini sur la dernière publication du tableau $posts
renvoyé via $wp_query->next_post()
Vous devez faire très attention en utilisant cette boucle globale outside / en tant que requêtes personnalisées et certaines fonctions peuvent y accéder et modifier sa valeur comme décrit dans la publication liée. C'est l'une des raisons pour lesquelles vous devez toujours réinitialiser les données postérieures à partir d'une nouvelle instance de WP_Query
. query_posts
rompt également ce global en cassant la requête principale, une des raisons pour laquelle query_posts
devrait être évité à tout prix
En gros, vous devez simplement définir le $post
global dans une fonction, car celle-ci se trouve en dehors du modèle actuel, mais vous pouvez définir le global en dehors de la boucle si vous le souhaitez.
Pour conclure, le $post
global étant l’un des globals les plus peu fiables pouvant être très facilement modifié par des fonctions, je suggérerais d’utiliser les recommandations de @ G.M. Dans la question liée