Почему возникают дубликаты при загрузке данных через Ajax?

Как исправить проблему дублирования записей в WordPress при использовании функции Ajax для подгрузки постов? Я создал скрипт, который должен динамически загружать записи без перезагрузки страницы, но каждая запись появляется в нескольких экземплярах. Я уже отладил код, проверил текущую страницу и обновил массив идентификаторов записей. Однако проблема с дублями остается. Нуждаюсь в совете или помощи для исправления этой проблемы.
  • 25 августа 2024 г. 15:14
Ответы на вопрос 2
Возможно, проблема с дублированием записей при использовании функции Ajax в WordPress может быть связана с тем, что при каждом запросе новые записи добавляются к уже существующим на странице. 

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

Примерно так:

1. При загрузке записей добавляйте им уникальный класс или атрибут (например, data-post-id).
2. При каждом новом запросе сначала проверяйте, есть ли уже записи с таким классом или атрибутом.
3. Если запись уже была загружена, пропускайте ее, если нет - добавляйте на страницу.

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

Если проблема все еще не решается, то возможно есть другие причины дублирования записей, например, ошибки в коде или несоответствие данных. В этом случае рекомендуется более детально изучить ваш код и данные, чтобы найти и исправить причину дублирования.
if (window.jQuery) {
    jQuery(function($){
        $('#loadmore').click(function(){
            let btn_load = $(this);
            let load_list = $('#load_list');
            let data = {
                'action': action,
                'query': true_posts,
                'page' : current_page
            };
            btn_load.text('Загружаю...');
            $.ajax({
                url:ajaxurl, // обработчик
                data:data, // данные
                type:'POST', // тип запроса
                success:function(data){
                    if(data) {
                        btn_load.text('Загрузить ещё');
                        load_list.append(data);
                        current_page++;
                        if (current_page == max_pages) btn_load.remove();
                    } else {
                        btn_load.remove();
                    }
                }
            });
        });
    });
}


add_action('wp_ajax_loadmore', 'load_more');
add_action('wp_ajax_nopriv_loadmore', 'load_more');
function load_more(){
    $args = unserialize( stripslashes( $_POST['query'] ) );
    $args['paged'] = $_POST['page'] + 1; // следующая страница
    $args['post_status'] = 'publish';
    query_posts( $args );
    if( have_posts() ) {
        while( have_posts() ): the_post();
            switch ($args['post_type']) {
                case 'news':
                    get_template_part( 'tpl/path/news/news-list-item', get_post_format() );
                    break;
            }

        endwhile;
    }
    die();
}


<?php
/**
 * Template Name: Страница новостей
 */
get_header(); ?>

    <?php query_posts([
        'post_type' => 'news',
        'post_status' => 'publish',
        'posts_per_page' => 12,
        'orderby'     => 'date',
        'order'       => 'DESC',
    ]); ?>

    <div id="load_list">
        <?php if( have_posts() ){
            while( have_posts() ){ the_post();
                get_template_part( 'tpl/path/news/news-list-item', get_post_format() );
            }
        } ?>
    </div>

    <?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; ?>';
            var action = 'loadmore';
        </script>
        <div id="loadmore">Показать еще</div>
    <?php endif; ?>

    <?php wp_reset_query(); ?>


<?php get_footer(); ?>
Похожие вопросы