Faut-il faire confiance aux post-globals?

20

@toscho a laissé un commentaire à cela répondre qui m'a fait réfléchir à nouveau. Quelle confiance devrions-nous avoir dans la portée mondiale, en particulier en ce qui concerne les publications post-globales telles que $post ?

  

Alors quoi? La variable globale peut être écrasée par tout le monde avant l'exécution de votre vérification. C’est l’intérêt 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 connexes.

Si vous répondez (et commentez) plusieurs publications avec des problèmes spécifiques causés par l'utilisation de requêtes personnalisées , il apparaît clairement que la plupart des problèmes sont dus au fait que les requêtes personnalisées ne sont pas réinitialisées ( globals définis par la requête principale).

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

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.

Il suffit simplement de télécharger un thème et d’installer des plugins pour faire ce qui est nécessaire ou même de copier le code à partir 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 tel que $post est si peu fiable? Devrions-nous utiliser un global comme $post ? Quelles sont les alternatives?

Juste pour partager mon esprit ici 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 , pour que le global est en cours de réinitialisation sur la $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 bon.

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

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

    
posée Pieter Goosen 07.11.2014 - 07:32

1 réponse

16

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

Cela dit, oui, global $post est l’un des vars les plus utilisés au monde. Il est donc judicieux d’utiliser un soin spécial pour le .

>

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

Lors d'un concours singulier , j'utilise get_queried_object() et vérifie généralement si $post est une instance valide de WP_Post :

$post = get_queried_object();

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

Je vérifie également cette information 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 du code qui s'appuie sur query_posts , il le mérite si son site est endommagé:

De plus, si je prévois certaines conditions, je les vérifie, par exemple. types de publication spécifiques ou statut spécifique.

Si j'ai besoin de plus de contrôles et plus souvent, 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 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:)

    
réponse donnée gmazzap 07.11.2014 - 13:37

Lire d'autres questions sur les étiquettes