@sergey1989

На первой странице пагинации WordPress 9 записей на остальных 8 при AJAX подгурзки?

Доброго времени суток. При подгрузки записей в WordPress встала задача сделать на первой странице 9 записей и при каждом клике подгружать 8 записей. Нашел похожую тему https://toster.ru/q/222186 , но там обычная пагинация без AJAX и в моем случае такое решение не работает. Как вариант рассматриваю просто скрывать лишний элемент, но при новом клике снова его отображать при этом скрывая крайний элемент в последнем выводе, хотя опнимаю, что такое решение не совсем грамотное.

<main class="row">
					<?php 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
   'posts_per_page' =>
					'9',
					
					'cat' =>
					'1',
);
$wp_query = new WP_Query( $args );
?>
					<?php $loop = 0; ?>
					<?php while ( $wp_query->
					have_posts() ) : $wp_query->the_post();?>
					<article class="col-md-8 col-sm-6">
						<div class="main-news">
							<time>
								<?php the_time( 'j F, Y'); ?></time>
							<div class="image-news hidden-sm hidden-xs">
								<a href="<?php the_permalink(); ?>
									">
									<?php if ( has_post_thumbnail() ) { the_post_thumbnail( 'first-thumb' ); } ?></a>

							</div>
							<div class="image-news hidden-md hidden-lg" style="background: none !important;">
								<a href="<?php the_permalink(); ?>
									">
									<?php if ( has_post_thumbnail() ) { the_post_thumbnail( 'second-thumb' ); } ?></a>
							</div>
							<a href="<?php the_permalink(); ?>
								" class="teaser-news" style="margin-top: -1px;">
								<?php the_title(); ?></a>
						</div>
					</article>

					<?php endwhile;  ?>
					<?php if (  $wp_query->
					max_num_pages > 1 ) : ?>
					<!-- Вывод кнопки подгузить -->
					<script>
	var ajaxurl = '<?php echo site_url() ?>/wp-admin/admin-ajax.php';
	var true_posts = '<?php echo serialize($wp_query->query_vars); ?>';
	var current_page = <?php echo (get_query_var('paged')) ? get_query_var('paged') : 1; ?>;
	var max_pages = '<?php echo $wp_query->max_num_pages; ?>';</script>

					<div class="text-center">
						<button type="button" id="true_loadmore" class="btn btn-danger">+ загрузить еще</button>
					</div>

					<?php endif; ?></main>


В functions php добавлена функция:

function true_load_posts(){
    $args = unserialize(stripslashes($_POST['query']));
    $args['paged'] = $_POST['page'] + 1; // следующая страница
    $args['post_status'] = 'publish';
    $q = new WP_Query($args);
    if( $q->have_posts() ):
        while($q->have_posts()): $q->the_post();
            ?>
          <article class="col-md-3 col-sm-6 main-news text-left">
                            <time>
                                <?php the_time( 'j F, Y'); ?></time>
                            <div class="image-news">
                            <a href="<?php the_permalink(); ?>"> <?php if ( has_post_thumbnail() ) { the_post_thumbnail( 'middle-thumb' ); } ?></a> </div>
                            <a href="<?php the_permalink(); ?>" class="teaser-news">
                            <?php the_title(); ?></a>
                        </article>
            <?php
        endwhile;
    endif;
    wp_reset_postdata();
    die();
}
 
 
add_action('wp_ajax_loadmore', 'true_load_posts');
add_action('wp_ajax_nopriv_loadmore', 'true_load_posts');

JS код подгрузчика:
jQuery(function($) {
  $('#true_loadmore').click(function() {
    $(this).text('Загружаю...'); // изменяем текст кнопки, вы также можете добавить прелоадер
    var data = {
      'action': 'loadmore',
      'query': true_posts,
      'page': current_page
    };
    $.ajax({
      url: ajaxurl, // обработчик
      data: data, // данные
      type: 'POST', // тип запроса
      success: function(data) {

        if (data) {
          $('#true_loadmore').text('Загрузить ещё').before(data); // вставляем новые посты
          current_page++; // увеличиваем номер страницы на единицу
          if (current_page == max_pages) $("#true_loadmore").remove(); // если последняя страница, удаляем кнопку
        } else {
          $('#true_loadmore').remove(); // если мы дошли до последней страницы постов, скроем кнопку
        }
      
      }
    });
  });

});
  • Вопрос задан
  • 873 просмотра
Решения вопроса 1
wppanda5
@wppanda5 Куратор тега WordPress
WordPress Mедведь
Решение не работает, потому, что вы не понимаете того, что вы делаете
1. в js скрипте не видно, что же за true_posts вы передаете в переменной query, но судя по обработчику вы там передаете основные параметры запроса в виде сериализованного массива, это бредовое решение. передавать достаточно номер страницы пагинации. (На работу или не работу пагинации это не влияет, но это не верно, и это охрененных размеров дыра, через которую получить из вашей базы можно все что хочешь). Запрос надо формировать в обработчике целиком.
2. то что вам не подходит, подходит если делать так

$args = unserialize(stripslashes($_POST['query']));
    $args['paged'] = $_POST['page'] + 1; // следующая страница
    $args['post_status'] = 'publish';
       $first_page_post_count = 9;
        $empty_pages_post_count = 8;

        if ($args['paged']  > 1) {
            $posts_per_page =  $empty_pages_post_count;
            if ($args['paged']  == 2) {
                $offset = $first_page_post_count;
            } else {
                $offset = $first_page_post_count + ( $empty_pages_post_count * ($args['paged']  - 2));
            }
        } else {
            $offset = 0;
            $posts_per_page = $first_page_post_count;
        }
        $args['posts_per_page'] =>$posts_per_page;
        $args['offset'] => $offset;
$q = new WP_Query($args);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы