web-dev-qa-db-fra.com

$ post-> ID ne fonctionne pas

J'ai le code suivant et alors que get_the_ID () fonctionne, $ post-> ID ne fonctionne pas, pourquoi?

    $the_query = new WP_Query( array(
        'post_type' => 'custompost',
    ) );

    while ( $the_query->have_posts() ) : $the_query->the_post();
        echo $post->ID;
    endwhile;
2
urok93

Votre boucle WP_Query est incomplète. Vous ne vérifiez pas si des publications ont réellement été trouvées avant la boucle, vous ne présentez pas de message indiquant que rien n'a été trouvé et vous ne nettoyez pas par la suite. Vous utilisez également la syntaxe 'other' qui rompt la correspondance entre accolades dans les IDE, vous rendant la vie plus difficile.

Essayez d'ajouter global $post; comme ceci:

global $post;
$the_query = new WP_Query( array(
    'post_type' => 'custompost'
) );

if($the_query->have_posts()){
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo $post->ID;
    }
    wp_reset_postdata();
}else {
    echo 'no posts found';
}

Lors de la rédaction des requêtes, il est important d'être cohérent et de bien faire les choses. Je recommande donc de lire ces diapositives d’Andrew Nacin, développeur WordPress Core chez Auttomatic:

http://www.slideshare.net/andrewnacin/you-dont-know-query-wordcamp-netherlands-2012

Cela vous indiquera où chaque type de requête est approprié, comment il convient de les utiliser et pourquoi.

Dans le code ci-dessus, j'ai ajouté une instruction if pour vérifier si des publications ont été renvoyées, et j'ai ajouté wp_reset_postdata, ce qui vous permettrait de continuer à utiliser la requête principale en nettoyant après la boucle personnalisée.

7
Tom J Nowell

L'astuce, identifiée par Tom Nowell, consiste à ajouter une référence à global $post.

Lorsque vous exécutez the_query->the_post(), WordPress charge le premier résultat de la requête dans un objet global $post. Voici comment cela se passe pour toutes les balises de template habituelles:

  • the_title()
  • the_content()
  • the_excerpt()
  • etc ...

Vous voyez que nous ne transmettons rien à à ces fonctions. Nous les appelons simplement. Chacune de ces fonctions référencera en interne l’objet global $post afin d’analyser, de préparer et d’imprimer la sortie souhaitée.

Dans votre boucle, vous appelez parfaitement the_post() pour renseigner les données, mais vous n'avez pas de référence pour les données elles-mêmes dans la portée de votre boucle. Si vous souhaitez éviter de faire référence à l'objet global $post, vous pouvez utiliser plutôt get_the_ID() .

Comme les autres balises de modèle que j'ai mentionnées ci-dessus, get_the_ID() appelle les données de l'objet global $post en interne, pour que vous n'ayez pas à le faire vous-même.

Mais si vous do voulez le faire vous-même, ajoutez simplement une référence globale avant d'essayer d'utiliser $post:

$the_query = new WP_Query( array(
    'post_type' => 'custompost',
) );

while ( $the_query->have_posts() ) : $the_query->the_post();
    global $post;  // Add this line and you're golden
    echo $post->ID;
endwhile;

Qu'est-ce que wp_reset_postdata()?

Si vous créez plusieurs boucles (c'est-à-dire que vous avez une grande boucle de publication, mais appelez une boucle secondaire à l'intérieur de celle-ci), vous pouvez appeler wp_reset_postdata() pour réinitialiser les éléments.

Fondamentalement, the_post() définira l’objet $post global pour qu’il contienne les données de la requête demandée. the_query->the_post() remplacera $post par les données de the_query. wp_reset_postdata() réinitialisera $post à la requête d'origine.

Donc, si vous utilisez des boucles imbriquées ou multiples, wp_reset_postdata() est un moyen de revenir à la boucle et à l'objet $post que vous aviez disponible avant d'appeler votre the_query->the_post() secondaire.

0
EAMann