web-dev-qa-db-fra.com

la requête wordpress dans l'en-tête ne se réinitialise pas et ne corrompt pas les autres boucles

Dans un élément de modèle de mon en-tête, j'ai le code suivant:

$args = array('post_type'=>'weather_today','orderby'=>'ID','order'=>'ASC','posts_per_page'=>1);
$query = new WP_Query($args);
$html;
if ($query->have_posts()){
$posts = $query->posts;
foreach($posts as $post) {
$html = $post->post_content;
}
}
wp_reset_postdata();
?>

Je crois comprendre que wp_reset_postdata est ce dont j'ai besoin pour réinitialiser la requête, en fonction de cette réponse: wp_reset_postdata () ou wp_reset_query () après une boucle personnalisée?

J'ai aussi essayé wp_reset_query() mais cela ne fonctionne pas, car le code de l'en-tête affecte les autres parties de mon modèle. Par exemple, lorsque je fais mon modèle single.php et que je le fais:

while ( have_posts() ) : the_post();
the_title();
endwhile; 

Je reçois le titre de type de poste weather_today, pas le post de single.php.

J'ai contourné cela dans mon category.php en faisant ceci:

$current_category_id = get_query_var('cat');
$current_category_obj = get_category($current_category_id);
$args = array('orderby'=>'ID','order'=>'DSC','posts_per_page'=>8,'cat'=>$current_category_id);
$query = new WP_Query($args);

Et ensuite, je reviens en boucle, mais je ne veux pas continuer à avancer sur le problème que ma requête d’en-tête ne réinitialise pas. Je ne connais pas de solution similaire pour single.php et il semble unideal de créer un WP Query sur un fichier modèle supposé instancier sa propre requête - comme par exemple comment single.php devrait être récupéré sur le message qui est unique compte tenu de l'URL, ou de toute façon cela fonctionne en interne.

Comment puis-je faire la requête dont j'ai besoin dans mon en-tête et pouvoir toujours faire fonctionner les autres fichiers de thème/modèle comme prévu?

2
Summer Developer

Deux problèmes ici.

Tout d'abord, vous n'utilisez pas correctement la boucle. Au lieu de foreach, utilisez while ( $query->have_posts() ) { $query->the_post(); //etc.

Deuxièmement, en utilisant foreach($posts as $post), vous écrasez la variable globale $ post. Si vous devez vraiment utiliser foreach, utilisez un nom de variable différent!

1
Peter HvD