Intereting Posts
Может ли set_transient () использоваться на нескольких сайтах? Кажется, не может заставить этот CSS работать … любые идеи почему? Список тегов с обычным текстом? Как добавить уведомления в интерфейсное меню для пользователей, когда они получили ответы? как удалить заголовок со страницы регистрации? Изменение позиции cancel_comment_reply_link и других элементов формы комментария Как обновить предварительный просмотр, когда пользовательские настройки изменились в моем пользовательском виджете Лучший способ обнаружить уникальные сообщения в wp rest api проблема с настройкой постоянной ссылки программно Обновлять информацию о профиле пользователя из functions.php Многопользовательская установка на IIS дает 404 попытке доступа к панели управления admin Как изменить размер Gravatar при использовании comments_template Как заменить собственный comment_count комментариями. Меню боковой панели WordPress для сообщений на основе даты – требуется руководство Страница перенаправления администратора на другую страницу администратора

Объедините результаты нескольких WP_Query, чтобы они были похожи на один WP_Query

Это код, который я использовал, при этом предыдущие параметры запроса были исключены для краткости. Как вы можете видеть, это происходит из виджета, отображающего сетку сообщений. Проблема в том, что я не могу понять, как написать запрос или несколько запросов, которые будут получать последнюю запись из каждой из шести категорий таким образом, который работает.

$r = new WP_Query( apply_filters( 'widget_posts_grid', $query ) ); if ( $r->have_posts() ) : ?> <?php echo wp_kses_post( $args['before_widget'] ); ?> <?php if ( $title ) { echo wp_kses_post( $args['before_title'] . $title . $args['after_title'] ); } ?> <div class="posts-grid"> <div class="row"> <?php while ( $r->have_posts() ) : $r->the_post(); ?> <div class="col-md-4 col-sm-6"> <?php get_template_part( 'content', get_post_format() ); ?> </div> <?php endwhile; ?> </div> </div> <?php echo wp_kses_post( $args['after_widget'] ); ?> <?php wp_reset_postdata(); endif; 

Я пробовал цикл foreach с array_merge, но результат, по-видимому, не может быть зациклен …

 $do_not_duplicate = array(); $r = new WP_Query(); $categories = get_categories(); foreach ( $categories as $category ) { $args = array( 'cat' => $category->term_id, 'post_type' => 'post', 'posts_per_page' => '1', 'post__not_in' => $do_not_duplicate ); $little_array = new WP_Query( $args ); $r = array_merge( $r, $little_array->posts ); while ( $r->have_posts() ) { $r->the_post(); $do_not_duplicate[] = $post->ID; } } $r->post_count = count( $r->posts ); for($i = 1; $r->have_posts(); $i++) { $r->the_post(); } if ( $r->have_posts() ) : 

Из моих исследований я действительно думал, что это сработает. Однако кажется, что после $r = array_merge( $r, $little_array->posts ); , $r появляется пустым. print_r($r); ничего не печатает.

Я ценю помощь.


Для справки, это код, следующий за указанным выше запросом:

 if ( $r->have_posts() ) : ?> <?php echo wp_kses_post( $args['before_widget'] ); ?> <?php if ( $title ) { echo wp_kses_post( $args['before_title'] . $title . $args['after_title'] ); } ?> <div class="posts-grid"> <div class="row"> <?php while ( $r->have_posts() ) : $r->the_post(); ?> <div class="col-md-4 col-sm-6"> <?php get_template_part( 'content', get_post_format() ); ?> </div> <?php endwhile; ?> </div> </div> <?php echo wp_kses_post( $args['after_widget'] ); ?> <?php wp_reset_postdata(); endif; 

Я не могу этого сделать, кроме как запустить несколько запросов по одному для каждой категории. Нам нужно быть умным здесь, чтобы избежать ненужной работы.

Давайте посмотрим на код; ( который я буду комментировать, чтобы облегчить процесс понимания )

 // Get the categories. We will only get the category ID's to speed things up $category_args = [ 'fields' => 'ids', ]; $categories = get_categories ( $category_args ); // Check if we have categories to avoid bugs if ( $categories ) { // Define the variable to hold an array of posts not to duplicate $do_not_duplicate = []; // Define a variable to hold our posts $posts_array = []; foreach ( $categories as $cat_id ) { // Setup our query arguments to get our posts $args = [ 'cat' => $cat_id, 'posts_per_page' => 1, 'post__not_in' => $do_not_duplicate, 'fields' => 'ids' // Only get post id's to increase performance ]; /** * Lets use get_posts as we do not need the whole object and get_posts by default * legally breaks pagination which makes the query faster, and it automatically * ignore sticky posts and by default does not get modified by filters */ $q = get_posts( $args ); // Check if we have posts if ( $q ) { /** * Now we need to add the post ID to the $do_not_duplicate array. * We will also pass the posts in $q to $posts_array * NOTE: you will need to rework this if you ever need more than one post per category */ $do_not_duplicate[] = $q[0]; $posts_array[] = $q[0]; } } //endforeach $categories // We can now run an instance of WP_Query to get the posts and query object if ( $posts_array ) { $final_args = [ 'posts_per_page' => count( $posts_array ), 'post__in' => $posts_array, 'ignore_sticky_posts' => 1, // Ignore stickies 'no_found_rows' => true, // Skip pagination, remove if needed ]; $final_query = new WP_Query( $final_args ); var_dump( $final_query ); // Now we can run te loop and output our posts if ( $final_query->have_posts() ) { while ( $final_query->have_posts() ) { $final_query->the_post(); the_title(); } //endwhile wp_reset_postdata(); // NEVER EVER forget this line } // endif $final_query->have_posts() } // endif $posts_array } // endif $categories 

Вы можете настроить, расширить и изменить его в соответствии с вашими потребностями. Обратите внимание, что все в коде было настроено для размещения только одного сообщения для каждой категории. Вам нужно будет изменить, как $do_not_duplicate и $posts_array создаются, если вы собираетесь запрашивать более одного сообщения для каждой категории