Я пытаюсь 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();
Вы, наверное, ищете offset
параметр за WP_Query
, Установка его в 3
заставит пропустить первые 3 результата при использовании posts_per_page
а также paged
,
Другой вариант — указать post_id
Если вы не хотите явно использовать post__not_in
параметр, но это потребует передачи массива значений для исключения при каждом запросе — возможно, вам удастся обойтись, просто передав первые 3 идентификатора, но я бы пошел с offset
,
Ключ 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);
},