get_posts работает, но новый wp_query не работает

Мне сказали, что get_posts – очень плохая функция для использования, что создание new WP_query абсолютно лучше.

Моя проблема в том, что мой код get_posts работает, но когда я попытался превратить его в WP_query , он возвращает пустые результаты. Помогите пожалуйста? 🙁 Мне бы очень хотелось, чтобы это работало, потому что я подозреваю, что get_posts, которые у меня есть на index.php / category-9.php, мешают нормальному циклу на category.php

Версия Get_posts:

 <?php if ( have_posts() ) : while ( (have_posts() ) ) : the_post(); ?> <div class="postcontainer"> <h2><a href="<?php the_permalink();?>"><?php the_title(''); ?></a></h2> <?php $args = array( 'post_type' => 'attachment', 'post_mime_type' => 'image', 'numberposts' => 4, 'post_status' => null, 'post_parent' => $post->ID, 'orderby' => name, 'order' => ASC ); $attachments = get_posts($args); if ($attachments) { foreach ($attachments as $post) { setup_postdata($post); ?> <a class="postpreview" href="<?php echo get_permalink($post->post_parent) ?>"><?php echo wp_get_attachment_image($post->ID, thumbnail) ?></a> <?php }; }; ?> <div class="clear"></div> </div> <?php endwhile; endif; wp_reset_query(); ?> 

Версия WP_query:

 <?php if ( have_posts() ) : while ( (have_posts() ) ) : the_post(); ?> <div class="postcontainer"> <h2><a href="<?php the_permalink();?>"><?php the_title(''); ?></a></h2> <?php $args = array( 'post_type' => 'attachment', 'post_mime_type' => 'image', 'numberposts' => 4, 'post_status' => null, 'post_parent' => $post->ID, 'orderby' => name, 'order' => ASC ); $attachments = new WP_Query($args); while ($attachments->have_posts()) : ?> <a class="postpreview" href="<?php echo get_permalink($post->post_parent) ?>"><?php echo wp_get_attachment_image($post->ID, thumbnail) ?></a> <?php endwhile; wp_reset_postdata(); ?> <div class="clear"></div> </div> <?php endwhile; endif; ?> 

Вы забываете $query->the_post() , который делает то же самое, что и setup_postdata() . Также вы используете $post->ID внутри цикла, но $post не является текущим пост-объектом в цикле. У вас также есть синтаксические ошибки; например, вы передаете thumnail в wp_get_attachment_image() вместо строки "thumbnail" и передаете name качестве аргумента orderby вместо строки "name" или ASC вместо "ASC" :

  <?php //as you are inside a loop but I don't see $post variable in your code, //I assume you want the current post in the loop as parent $parent_id = get_the_ID(); $args = array( 'post_type' => 'attachment', 'post_mime_type' => 'image', 'posts_per_page' => 4, 'post_status' => 'inherit', 'post_parent' => $parent_id, 'orderby' => 'name', 'order' => 'ASC' ); $attachments = new WP_Query($args); while ($attachments->have_posts()) { $attachments->the_post(); //I pass $parent_id to get_permalink() because you was trying //to do that in your code but I'm not sure if this is what you want ?> <a class="postpreview" href="<?php echo get_permalink($parent_id); ?>"><?php echo wp_get_attachment_image(get_the_ID(), 'thumbnail') ?></a> <?php } wp_reset_postdata(); ?> 

Во всяком случае, new WP_query не намного лучше, чем get_posts() , каждый из которых имеет свои преимущества и лучше зависит от того, что вы хотите сделать.