web-dev-qa-db-fra.com

Faut-il faire confiance aux post-globaux?

@toscho a laissé un commentaire à cette réponse qui m'a fait réfléchir à nouveau. Quelle confiance devrions-nous avoir dans la portée mondiale, spécialement en ce qui concerne les publications post-globales comme $post?

Et alors? La variable globale peut être écrasée par tout le monde avant l'exécution de votre vérification. C'est le but des variables globales: l'accès global.

$post par exemple est sûrement l’un des globals le plus modifié dans le thème lui-même ou par des plugins. Mais c’est aussi le système le plus couramment utilisé dans d’autres applications au sein d’un modèle donné, par exemple pour configurer des publications associées.

En répondant (et en commentant) plusieurs publications avec des problèmes spécifiques causés par l’utilisation de requêtes personnalisées , il apparaît vraiment que la plupart des problèmes sont dus au fait que les requêtes personnalisées ne sont pas réinitialisées (les requêtes personnalisées modifient les paramètres globaux définis par la requête principale).

Il en ressort que $post n’est pas fiable. Tout morceau de code mal écrit qui utilise une requête personnalisée peut modifier le $post global, ce qui à son tour cassera quelque chose (comme les publications associées).

Seuls quelques développeurs WordPress connaissent suffisamment le fonctionnement interne du noyau et savent ce qu'il faut éviter et ce qu'il ne faut pas faire. La grande majorité des utilisateurs n’a aucune idée du fonctionnement du noyau WordPress.

Ils téléchargent simplement un thème et installent des plugins pour faire ce qui est nécessaire ou même simplement copier le code d'un tutoriel. Disons qu'ils installent un plugin mal écrit qui casse leurs posts liés sur leur single, comment vont-ils savoir ce qui a causé ça? Pourront-ils résoudre ce problème eux-mêmes ou seront-ils la centième personne à écrire un e-mail à l'auteur du thème sur ce problème ou à poser une question sur ce site?

Ma question: Comment pouvez-vous vous protéger contre de tels problèmes causés par d'autres codes importés lorsqu'un code global comme $post est si peu fiable? Devrions-nous utiliser un global comme $post du tout? Quelles sont les alternatives?

Je voudrais juste partager mon esprit avant de conclure: j’ai pensé (et observé dans certains thèmes et plugins également) en utilisant wp_reset_postdata() ou wp_reset_query() avant d’utiliser $post, afin d’être sûr que la variable globale est réinitialisée sur le $post de la requête principale . Mais pourquoi devrais-je gonfler mon code dans mon thème parce que quelqu'un d'autre n'a pas correctement codé son plugin? Et si quelqu'un a correctement réinitialisé sa requête personnalisée, cette opération est exécutée une seconde fois, ce qui n'est pas bien.

La deuxième méthode à laquelle je pensais consiste à utiliser le $wp_query, puis à utiliser ses méthodes, quelque chose comme $wp_query->post.

Toute pensée à ce sujet sera appréciée.

21
Pieter Goosen

Il y a une triste vérité: vous ne pouvez jamais être sûr que some code ne cassera pas votre code, et il n'y a rien que vous pouvez faire pour empêcher cela. Surtout dans WordPress, où tout est global.

Cela dit, oui, le $post global est l’un des fichiers var les plus utilisés. Vous pouvez donc utiliser un spécial care pour lui peut être une bonne idée.

Dans mon code, j'accède rarement directement au $post global.

Dans singular contest, j'utilise get_queried_object() et vérifie généralement si $post est une instance WP_Post valide:

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

Je fais cette vérification aussi dans les rares cas où j'accède directement à $post.

Considérez que get_queried_object() renvoie une valeur inattendue si du code utilise query_posts, mais si quelqu'un utilise un code reposant sur query_posts, il le mérite si son site Web est endommagé :)

De plus, si je m'attends à certaines conditions, je les vérifie, par exemple. types de poste spécifiques ou statut particulier.

Si j'ai besoin de plus de chèques et plus d'endroits, je crée une fonction pour les exécuter:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

Lorsque vous vous trouvez dans une requête personnalisée, l'appel de the_post() réinitialise l'objet de publication en boucle, de sorte que tout devrait bien se passer. Ensuite, il est de ma responsabilité d'appeler wp_reset_postdata() après une requête personnalisée, ce que je fais bien sûr :)

16
gmazzap