Ajax загружает дубликат сообщения

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

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

Какие-либо предложения? Любая помощь приветствуется.

Файл loop.php

<div class="post-left"> <?php query_posts(array('post__not_in' => $id_merge,'posts_per_page'=>'2')); $do_not_duplicate = $post->ID; if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue; $ids[] = get_the_ID(); ?> <div class="images-grid-page-wrapper"> <?php the_title(); ?> </div> <?php endwhile; endif; // End the loop. Whew. ?> </div> <div class="post-mid"> <?php query_posts(array('post__not_in' => $id_merge,'posts_per_page'=>'3')); $do_not_duplicate = $post->ID; if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue; $ids[] = get_the_ID(); ?> <div class="images-grid-page-wrapper"> <?php the_title(); ?> </div> <?php endwhile; endif; // End the loop. Whew. ?> </div> 

functions.php

 add_action('wp_ajax_infinite_scroll', 'wp_infinitepaginate'); // for logged in user add_action('wp_ajax_nopriv_infinite_scroll', 'wp_infinitepaginate'); // if user not logged in function wp_infinitepaginate(){ $loopFile = $_POST['loop_file']; get_template_part( $loopFile ); exit; } 

Аякса

 jQuery(document).ready(function($) { var count = 1; var total = <?php echo $wp_query->max_num_pages; ?>; $(window).scroll(function(){ if ($(window).scrollTop() == $(document).height() - $(window).height()){ if (count > total){ return false; }else{ loadArticle(count); } count++; } }); function loadArticle(){ $('a#inifiniteLoader').show('fast'); $.ajax({ url: "<?php bloginfo('wpurl') ?>/wp-admin/admin-ajax.php", type:'POST', data: "action=infinite_scroll&loop_file=loop", success: function(html){ $('a#inifiniteLoader').hide('1000'); $("#content").append(html); // This will be the div where our content will be loaded } }); return false; } }); 

Solutions Collecting From Web of "Ajax загружает дубликат сообщения"

У вас есть несколько вещей, чтобы рассмотреть здесь.

Давайте начнем работу браузера.

Вы создаете HTML, настолько хороший, что он содержит структуру и все для вашего сайта. Нет статей.

Следующим шагом, который должен сделать ваш браузер, является вызов AJAX.

Вот первые вещи, которые нужно учитывать. В вашей функции document.ready вы не отправляете смещение сообщений в вашу функцию AJAX-php. Насколько я могу судить по вашему коду, вы всегда хотите показать 5 сообщений при вызове функции.

Поэтому рассмотрим следующее:

Сначала счет равен 0. При каждом успешном обновлении счет увеличивается на 5. Вы должны поместить эту часть в успешную часть вашего вызова AJAX. Кроме того, ваша функция AJAX-php должна знать смещение постов, которые должны быть доставлены.

Другое дело, что у вас может быть другой запрос на вашем сайте, чем тот, который находится в вашей функции AJAX. Поэтому убедитесь, что значение var total – это правильное число, но я не буду вдаваться в это дальше и оставлю его так, как вы его получили. Вы поняли эту идею.

Ваш Javascript должен выглядеть следующим образом:

 jQuery(document).ready(function($) { var count = 0; var total = <?php echo $wp_query->max_num_pages; ?>; $(window).scroll(function(){ if ($(window).scrollTop() == $(document).height() - $(window).height()){ if (count > total){ return false; }else{ loadArticle(count); } } }); function loadArticle(count){ $('a#inifiniteLoader').show('fast'); // I prefer doing the ajaxdata with an array var ajaxdata = { 'action' : 'infinite_scroll' 'offset' : count } $.ajax({ url: "<?php bloginfo('wpurl') ?>/wp-admin/admin-ajax.php", type:'POST', data: ajaxdata, success: function(html){ $('a#inifiniteLoader').hide('1000'); $("#content").append(html); // This will be the div where our content will be loaded count = count + 5; // Increase the number of posts that are already shown. } }); return false; } }); 

Как вы можете видеть, я создал массив для ajaxdata – проще взглянуть на него таким образом. Я также удалил loopfile=loop , как вы можете видеть позже, потому что я бы сделал ответ по-другому.

До сих пор так хорошо – теперь нам стоит подумать о том, чтобы создать ответ AJAX немного иначе. Вы зарегистрировали его правильно, но я бы обработал его не с помощью get_template_part , get_template_part другую функцию, передав переменные.

Регистрация функции AJAX будет такой:

 add_action('wp_ajax_infinite_scroll', 'wp_infinitepaginate'); // for logged in user add_action('wp_ajax_nopriv_infinite_scroll', 'wp_infinitepaginate'); // if user not logged in function wp_infinitepaginate(){ load_ajax_results($_POST['count']); exit; } 

Последний шаг – это фактическая функция для объединения вашего вывода. Вы можете разместить это в любом месте, в файле functions.php или другом файле. Я предпочитаю создать файл ajax-functions.php который включен в мои functions.php , содержащий все вышеперечисленные функции (за исключением Javascript, конечно)

 <?php function load_ajax_results( $offset ) { // I use the $_POST['count'] as $offset here ?> <div class="post-left"> <?php $args = array( 'numberposts' => '2', // 2 Posts to show here 'offset' => $offset // the number of Posts to skip, given by the AJAX call ); query_posts( $args ); // nothing else should be needed if (have_posts()) : while (have_posts()) : the_post(); ?> <div class="images-grid-page-wrapper"> <?php the_title(); ?> </div> <?php endwhile; endif; // End the loop. Whew. ?> <?php wp_reset_query(); // reset it ?> </div> <div class="post-mid"> <?php $offset = $offset + 2; // because we had 2 Posts before $args = array( 'numberposts' => '3', // 3 Posts to show here 'offset' => $offset // the number of Posts to skip, given by the AJAX call ); query_posts( $args ); // nothing else should be needed if (have_posts()) : while (have_posts()) : the_post(); ?> <div class="images-grid-page-wrapper"> <?php the_title(); ?> </div> <?php endwhile; endif; // End the loop. Whew. ?> </div> <?php } ?> 

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

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

Не тестировал это при моей установке, но я надеюсь, что вы поймете эту идею. Если есть какие-либо ошибки, извините, и если есть какие-либо вопросы, прокомментируйте пожалуйста 🙂