Не работает ajax подгрузка постов WordPress

98
20 апреля 2022, 11:50

Есть страничка постов с табами для каждой категории, выглядит это так:

В каждой вкладке соответственно выводятся посты из своей категории и подгрузка должна подгружать свои посты для каждой вкладки. Плюс здесь должен быть вывод из 4х конкретных категорий. На данный момент видно что в data-true-posts копки передаются какие-то данные, но кнопка вроде как показывает загрузку, пропадает и при этом посты новые не подгружает. Вывод постов из своей категории для каждой вкладки тоже работает. Это страница блога, код в файле index.php:

<?php $categories = get_categories([
                        'include'   => array(20,21,22,8)
                    ]);
                    foreach( $categories as $key => $category) : ?>
                    <?php $args = array(
                        'posts_per_page' => 1,
                        'post_type' => 'post',
                        'tax_query' => array(
                                array(
                                    'taxonomy'  => 'category',
                                    'field'     => 'term_id',
                                    'terms'     => $category -> term_id,
                                )
                            )
                    );
                    $query = new WP_Query( $args );
                    // Цикл
                    if ( $query->have_posts() ) : ?>
                        <div class="tabs-content blog-preview">
                            <div class="row tabs-content_blog-content">
                            <?php while ( $query->have_posts() ) : $query->the_post(); ?>
                                <div class="col-12">
                                    <div class="blog-card  blog-preview__item">
                                        <div class="blog-card__img irof">
                                            <?php the_post_thumbnail(); ?>
                                        </div>
                                        <div class="blog-card__body">
                                            <h3 class="text-h2 mb-20 blog-card__title"><?php the_title(); ?></h3>
                                            <div class="text-h4 mb-30 w-100"><?php the_date( 'd F Y' ); ?></div>
                                            <a href="<?php the_permalink(); ?>">
                                                <p class="blog-card__text"><?php echo get_excerpt(400); ?><a href="<?php the_permalink(); ?>" class="blog-card__link">read more</a></p>
                                            </a>
                                        </div>
                                    </div>
                                </div>
                                <!-- col-->
                            </div>
                            <?php endwhile; ?>
                            <?php if (  $query->max_num_pages > 1 ) : ?>
                                <script>
                                    var ajaxurl = '<?php echo site_url() ?>/wp-admin/admin-ajax.php';
                                </script>
                                <div class="row page-location-content__btn justify-content-center">
                                    <button type="button" data-true_posts='<?php echo serialize($query->query_vars); ?>'
                                        data-current_page = '<?php echo (get_query_var('paged')) ? get_query_var('paged') : 1; ?>'
                                        data-max_pages='<?php echo $query->max_num_pages; ?>' class="loadmore_blog button">Show more</button>
                                </div>
                            <?php endif; ?>
                        </div>
                    <?php endif; ?>
                    <?php wp_reset_query(); ?>
                    <?php endforeach; ?>

Код в файле functions.php:

function blog_load_posts(){
        $args = unserialize( stripslashes( $_POST['query'] ) );
        $args['paged'] = $_POST['page'] + 1; // we need next page to be loaded
        $args['post_status'] = 'publish';
        $args['post_type'] = 'post';
        $args['posts_per_page'] = 1; // по сколько записей подгружать
        $args['tax_query'] = array( array( 'taxonomy'  => 'category', 'field'     => 'term_id', 'terms'     => $args['cat']));
        // обычно лучше использовать WP_Query, но не здесь
        query_posts( $args );
        // если посты есть
        if( have_posts() ) : while( have_posts() ): the_post();
            echo '
                <div class="col-12">
                    <div class="blog-card  blog-preview__item">
                        <div class="blog-card__img irof">
                            '. get_the_post_thumbnail() .'
                        </div>
                        <div class="blog-card__body">
                            <h3 class="text-h2 mb-20 blog-card__title">'. get_the_title() .'</h3>
                            <div class="text-h4 mb-30 w-100">'. get_the_date( 'd F Y' ) .'</div>
                            <a href="'. get_the_permalink() .'">
                                <p class="blog-card__text">'. get_excerpt(400) .'<a href="'. get_the_permalink() .'" class="blog-card__link">read more</a></p>
                            </a>
                        </div>
                    </div>
                </div>
            ';
        endwhile; endif;
        die();
    }

    add_action('wp_ajax_loadmoreblog', 'blog_load_posts');
    add_action('wp_ajax_nopriv_loadmoreblog', 'blog_load_posts');

Код в js файле:

$('.loadmore_blog').click(function () {
        var el = $(this);
        var true_posts = el.attr('data-true_posts');
        var current_page = el.attr('data-current_page');
        var max_pages = el.attr('data-max_pages');
        $(this).text('Loading...'); // изменяем текст кнопки, вы также можете добавить прелоадер
        var $dataTarget = $(this).closest('.tabs-content').find('.tabs-content_blog-content');
        var data = {
            'action': 'loadmoreblog',
            'query': true_posts,
            'page': current_page
        };
        $.ajax({
            url: ajaxurl, // обработчик
            data: data, // данные
            type: 'POST', // тип запроса
            success: function (data) {
                if (data) {
                    el.text('Show more'); // вставляем новые посты
                    current_page++; // увеличиваем номер страницы на единицу
                    el.attr('data-current_page', current_page);
                    if (current_page == max_pages) el.remove(); // если последняя страница, удаляем кнопку
                    $dataTarget.append(data);
                } else {
                    el.remove(); // если мы дошли до последней страницы постов, скроем кнопку
                }
            }
        });
    });
READ ALSO
Ошибка Trying to access array offset on value of type null

Ошибка Trying to access array offset on value of type null

Я понимаю, что эту ошибку уже тысячу раз рассматривалиНа просторах интернета я нашёл три решения этой ошибки в моём случае

112
Загрузка изображений на сервер. Безопасен ли код?

Загрузка изображений на сервер. Безопасен ли код?

Написал код загрузки изображения на сервер - надежен ли он или можно как то загрузить вредоносный кодМожет есть советы какие нибудь? PHP

198
Рефакторинг старого кода php

Рефакторинг старого кода php

Возникла необходимость рефакторинга довольно старого кода на php, написанного примерно в 2005м годуКод запускается на php 5

94
Записать полученный ответ в формате JSON в MySQL

Записать полученный ответ в формате JSON в MySQL

Всем приветЕсть сайт на Wordpres

73