web-dev-qa-db-fra.com

Propriété non définie: WP_Query :: $ post

Je travaille sur des comparaisons assez élaborées entre les métadonnées et j'ai un peu de mal à me référer correctement aux résultats de ma requête. La première requête pour établir $team_is_home fonctionne bien, mais dès que j'essaie de capturer l'ID des publications où le $team_is_home devient un peu abominable et que des avertissements s'affichent: "Propriété non définie: WP_Query :: $ post"

$args = array(
       'post_type' => 'match_report',
       'post_status' => 'publish',
       'meta_query' => array(
           array(
                 'key' => 'report_home-select',
                 'value' => $team_id,
                 'compare' => '=',
           ),
       )                                  
     );

    $hometeams = new WP_Query($args);       
    $team_is_home =  $hometeams->found_posts;
    $scorehome = get_post_meta($hometeams->post->ID, 'report_homescore'); 

Comment devrais-je me référer à $hometeams->post->ID pour éviter cet avertissement?

1
mantis

Tout d’abord, le champ post de WP_Query est l’ID de publication en cours et non un objet de publication. Mais je ne pense pas que vous devriez l’utiliser avant d’appeler la méthode the_post().

Normalement, vous devriez le faire de cette façon:

$args = ...
$hometeams = new WP_Query( $args );
$teamishome = $hometeams->have_posts();
while ( $hometeams->have_posts() ) {
  $hometeams->the_post();
  $scorehome = get_post_meta($post->ID, 'report_homescore', true); // you want only one meta, not all array I guess.
  ...
}
4
Krzysiek Dróżdż

Si vous var_dump($hometeams);, vous verrez que $hometeams->post est défini sur la première publication dans les résultats de la requête, même avant que $hometeams->the_post soit exécuté. WP_Query l'initialise automatiquement si vous avez des publications dans le jeu de résultats .

L'avertissement "Propriété non définie" se produit lorsque votre jeu de résultats est vide et que, par conséquent, $hometeams->post ne peut pas être défini/initialisé.

Vous devez vérifier que vous avez un $hometeams->post rempli avant d'essayer de l'utiliser. Si vous utilisez while ( $hometeams->have_posts() ) { comme suggéré dans une réponse ou foreach($hometeams->posts as $key => $post){ comme dans une autre, vous passez en boucle sur $hometeams->posts et évitez ainsi complètement le problème avec $hometeams->post.

Une autre option serait ...

if (!empty($hometeams->post)) {
  $scorehome = get_post_meta($hometeams->post->ID, 'report_homescore'); 
}

... cependant, puisque votre requête ne contient pas 'posts_per_page' => 1, vous devez utiliser une boucle ou vous ne recevrez qu’un des nombres potentiellement élevés de publications dans le jeu de résultats.

Veillez à exécuter reset_postdata après votre boucle secondaire pour réinitialiser $post, ou wp_reset_query si nécessaire.

2
s_ha_dum

Vous pouvez aussi le faire avec foreach

$args = ...
$hometeams = new WP_Query( $args );
foreach($hometeams->posts as $key => $post){
    echo get_post_meta($post->ID, 'report_homescore', true);
}
1
ksr89