AJAX получает сообщения из wpquery, предотвращает дублирование сообщений

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

на странице отображается 3 сообщения при загрузке страницы, затем посетитель может получать еще 3 сообщения при каждом нажатии кнопки «ЗАГРУЗИТЬ БОЛЬШЕ».

Теперь я хочу загрузить 9 постов при загрузке страницы, но оставляю по 3 поста при каждом нажатии кнопки «ЗАГРУЗИТЬ БОЛЬШЕ».

Возникает проблема со значением номера страницы в WPQuery, он получает те же 3 сообщения, которые уже отображались.

как я могу предотвратить дублирование постов?

Пожалуйста, проверьте это здесь мой временный сайт

[обратите внимание, что у меня есть менее 9 сообщений на странице категории, все они должны быть загружены]

(function($) {
$(document).ready(function(){
var $content = $('#list-content');
var $btnLoad = $('#btnLoad');
var loading = true;
var page = 1;
var load_posts = function($count){
var post_id = $(this).attr( 'id' );
/** Ajax Call */
$.ajax({
cache       :   false,
timeout     :   8000,
url         :   php_array.admin_ajax,
type        :   "POST",
data        :   {action:'main_query', numPosts : $count, pageNumber: page, condition: php_array.condition, val: php_array.val},

beforeSend  :   function() {
$('#loadimg').slideToggle("fast");
$btnLoad.prop("disabled",true);
},
success     : function(data, textStatus, jqXHR ){
var $data = $( data );
if($data.length){
$content.append( $data );
$btnLoad.prop("disabled",false);
}
else{
$btnLoad.html("That's it");
$btnLoad.prop("disabled",true);
}
},
error       : function( jqXHR, textStatus, errorThrown ){
if(t==="timeout") {
alert("Server is too slow, try again later");
} else {
alert(t);
}
console.log( 'ajaxLoop.js: The following error occured: ' + textStatus, errorThrown );
},
complete    : function( jqXHR, textStatus ){
$('#loadimg').slideToggle("fast");
loading = false;
page++;
}
});
}
$btnLoad.on("click", function(e) {
e.preventDefault();
loading = true;
load_posts(3);
});
load_posts(9);  //load the first elements
});

})(jQuery);

Код PHP:

function main_query_init() {
/** Made Query */
$numPosts = (isset($_POST['numPosts'])) ? $_POST['numPosts'] : 0;
$page = (isset($_POST['pageNumber'])) ? $_POST['pageNumber'] : 0;
$condition = (isset($_POST['condition'])) ? $_POST['condition'] : '';
$val = (isset($_POST['val'])) ? $_POST['val'] : '';
$args = array(
'posts_per_page'=>  $numPosts,
'paged'         =>  $page,
);
if($condition != ''){
$args[$condition] = $val;
}
$post_query = new WP_Query( $args );
if ($post_query->have_posts()) : while ($post_query->have_posts()) : $post_query->the_post();

0

Решение

Вы, наверное, ищете offset параметр за WP_Query, Установка его в 3 заставит пропустить первые 3 результата при использовании posts_per_page а также paged,

Другой вариант — указать post_idЕсли вы не хотите явно использовать post__not_in параметр, но это потребует передачи массива значений для исключения при каждом запросе — возможно, вам удастся обойтись, просто передав первые 3 идентификатора, но я бы пошел с offset,

0

Другие решения

Ключ var currCount = $data.filter('article').length;
где я храню текущее количество сообщений из ответа ajax.

Так как я прошу дополнительные 3 сообщения при каждом нажатии кнопки загрузки, то if((currCount % 3) == 0) скажет мне, если он получил 3 сообщения, в противном случае больше нет сообщений и нет необходимости увеличивать page счетчик.

success     : function(data, textStatus, jqXHR ){
var $data = $( data );
var currCount = $data.filter('article').length;
totalCount += currCount;
if(currCount > 0){
$content.append( $data );
$btnLoad.prop("disabled",false);

if((currCount % 3) == 0)
page += currCount / 3;
else
page += (parseInt(totalCount/3) + 1);
return;
}
$btnLoad.html("That's it");
$btnLoad.prop("disabled",true);
},
0

По вопросам рекламы [email protected]