Intereting Posts
Пользовательский класс post, генерирует уникальный идентификатор от 1 до x в зависимости от количества сообщений? вставить html-тег с помощью php-плагина Создание пути в плагине для вызова функции + Персонаж в постоянной ссылке Не удалось получить текущий идентификатор меню $ wpdb запрашивает тип сообщения в течение определенного периода таксономии при заказе сообщений по специальной метаинформации? Необходимо добавить тег привязки в избранном изображении для открытия в новой вкладке Получить последнюю измененную дату для ссылки меню Вставить меню в местоположение темы в зависимости от состояния входа пользователя / выхода из системы Добавьте дополнительный столбец в / my-account / subscriptions / страницу WooCommerce Woocommerce 3.1 Добавить изображение товара для подтверждения заказа электронной почты не работает Как добавить медиафайлы с помощью PHP Как получить количество просмотров каждой страницы на сайте и добавить этот (увеличивающий) номер к Виджет панели мониторинга список страниц только от основного родителя хранить виджет в объекте и возвращать его в ответ API API-интерфейса wp

Разбиение страницы / бесконечная прокрутка с помощью WP_Query и нескольких циклов

Мне нужно, чтобы на главной странице моего сайта было 3 столбца: – первый, имеющий 5 наиболее просматриваемых сообщений; – второй со следующими 5 наиболее просматриваемыми сообщениями; – Третий с последними сообщениями.

Я не хочу, чтобы сообщения никогда не повторялись в том же столбце или другом столбце, поэтому я использую wp_query для получения сообщений, которые я хочу, в количестве, которое я хочу. Вот что происходит, когда я загружаю вторую страницу, либо используя простую разбивку на страницы, либо бесконечную прокрутку:

  • Первый цикл загружает 5-10 наиболее просматриваемых сообщений, которые уже были показаны в первом прогоне второго цикла;
  • Второй цикл загружает следующие 5 наиболее просматриваемых сообщений, некоторые из которых уже были загружены в третий цикл, когда он запускался в первый раз;
  • Третий цикл загружает самые последние записи и не был загружен на первом или втором циклах.

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

Вот код, который я использую:

<div id="content"> <div class="recentColumn"> <div class="columnContent"> <? $hotArgs = array( 'post__not_in' => $loaded, 'meta_key' => 'wpb_post_views_count', // Pega o número de visitas do post. 'orderby' => 'meta_value_num', // Ordena do mais visitado para o menos visitado. 'posts_per_page' => '2', 'paged' => $paged ); $hot = new WP_Query( $hotArgs ); if ($hot->have_posts()) : while ($hot->have_posts()) : $hot->the_post(); $loaded[] = $post->ID; ?> <div class="articleContent"> <article class="recent" role="article"> <a href="<?php the_permalink();?>" title="<?php the_title();?>"><?php the_category();?> <header> <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1> <?php the_excerpt(); ?> </header> </article> </div> <?php endwhile; endif; ?> </div> </div> <div class="popularColumn"> <div class="columnContent"> <? $nextArgs = array( 'post__not_in' => $loaded, 'meta_key' => 'wpb_post_views_count', // Pega o número de visitas do post. 'orderby' => 'meta_value_num', // Ordena do mais visitado para o menos visitado. 'posts_per_page' => '3', 'paged' => $paged ); $next = new WP_Query( $nextArgs ); if ($next->have_posts()) : while ($next->have_posts()) : $next->the_post(); $loaded[] = $post->ID; ?> <div class="articleContent"> <article class="popular" role="article"> <a href="<?php the_permalink();?>" title="<?php the_title();?>"><?php the_category();?> <header> <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1> </header> </article> </div> <?php endwhile; endif; ?> </div> </div> <div class="randomColumn"> <div class="columnContent"> <? $recentsArgs = array( 'post__not_in' => $loaded, 'posts_per_page' => '3', 'paged' => $paged ); $recents = new WP_Query( $recentsArgs ); if ($recents->have_posts()) : while ($recents->have_posts()) : $recents->the_post(); $loaded[] = $post->ID; ?> <div class="articleContent"> <article class="random" role="article"> <header> <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1> </header> </article> </div> <?php endwhile; endif; ?> </div> </div> 

Я думаю, что в решении может быть использован php-сеанс или переменная, которая хранит идентификатор уже загруженных сообщений, а в цикле проверяет, были ли сообщения загружены или не загружены до их продолжения. Я пытался это сделать, но это не сработало. У меня слишком мало навыков по php, и, возможно, кто-то мог бы лучше понять, как заставить его работать.

Я ценю любую помощь. Благодарю.

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

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

Крайне важно сбросить каждый пользовательский запрос, который вы создаете. Тебе нужно это сделать. Вы можете сделать это, просто позвонив wp_reset_postdata(); после каждого запроса для восстановления переменной $post . Посмотрите примеры в приведенных ссылках

Вы можете воссоздать $loaded массив из базы данных:

 $hot_ppp = 3; $next_ppp = 3; $recents_ppp = 3; if ( $paged > 1 ) { $prev_hot_next_loaded = $wpdb->get_col( $wpdb->prepare( 'SELECT ID FROM ' . $wpdb->posts . ' p JOIN ' . $wpdb->postmeta . ' pm ON pm.post_id = p.ID AND pm.meta_key = %s' . ' WHERE p.post_type = %s AND p.post_status = %s ORDER BY pm.meta_value+0 DESC LIMIT %d', 'wpb_post_views_count', 'post', 'publish', ( $hot_ppp + $next_ppp ) * ( $paged - 1 ) ) ); $prev_recents_loaded = $wpdb->get_col( $wpdb->prepare( 'SELECT ID FROM ' . $wpdb->posts . ' WHERE ID NOT IN (' . implode(',', $prev_hot_next_loaded ) . ')' . ' AND post_type = %s AND post_status = %s ORDER BY post_date DESC LIMIT %d', 'post', 'publish', $recents_ppp * ( $paged - 1 ) ) ); $loaded = $prev_hot_next_loaded + $prev_recents_loaded; }