web-dev-qa-db-fra.com

Quand utiliser Global $ post et d'autres variables globales?

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

5
alemur

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.

8
NateWr

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

4
Pieter Goosen