AJAX подгрузка постов в WP Query
Я пытаюсь реализовать AJAX подгрузку постов в WP Query, чтобы сначала выводилось 2 поста, а затем по кнопке "Загрузить еще" подгружались следующие. Какой лучший подход для решения этой проблемы, так как текущий код не работает?
JavaScript
var ajaxRequest=function(){
var filter = $('#filter');
var page = 1; // Текущая страница
var ppp = 3; // Количество постов на странице
$.ajax({
url: filter.attr('action'),
data: filter.serialize(),
type: 'POST',
dataType: 'json',
offset: (page * ppp) + 1,
ppp: ppp,
success: function(response) {
page++;
$(".card-wrap").append(response); // Класс контейнера для постов
$("#more_posts").attr("disabled",false);
}
});
};
PHP
<?php
header("Content-type: application/json"); // Отправляем ответ в формате JSON
$offset = $_POST["offset"];
$ppp = $_POST["ppp"];
$args = array(
'order' => $_POST['date'],
'post_type' => 'custom',
'posts_per_page' => 2,
'offset' => $offset,
);
[Остальная часть запроса]
?>
HTML
<a id="more_posts" href="#">Загрузить еще</a>
Если вы хотите использовать AJAX в WordPress, вам необходимо выполнить следующие шаги: 1) Сначала создайте ваш JS-файл, например, main.js.
2) Локализуйте его в functions.php с помощью wp_localize_script()
.
wp_enqueue_script( 'main.js', get_template_directory_uri().'/js/main.js', array( 'jquery' ) );
wp_localize_script( 'main.js', 'ajax_object', array('ajax_url' => admin_url('admin-ajax.php')) );
3) Создайте ваш JavaScript или jQuery код для выполнения запроса через AJAX, и в объекте данных AJAX добавьте свойство action, например, action: 'load_more_posts'. Это свойство action вызовет функцию с таким же именем для выполнения нашего кода.
jQuery(function($){
$('#load_more_posts').on('click', function(e){
console.log('hi');
e.preventDefault();
var $offset = $(this).data('offset');
console.log('var'+$offset);
$.ajax({
method: 'POST',
url: ajax_object.ajax_url,
type: 'JSON',
data: {
offset: $offset,
action: 'load_more_posts'
},
success:function(response){
console.log(response);
$('#load_more_posts').data('offset', parseInt(response.data.offset));
}
});
})
});
4) В functions.php
add_action( 'wp_ajax_load_more_posts', 'load_more_posts' );
add_action( 'wp_ajax_nopriv_load_more_posts', 'load_more_posts' );
function load_more_posts(){
global $post;
$args = array('post_type'=>'post', 'posts_per_page'=> 2, 'offset'=> $_POST['offset']);
$rst=[];
$query = new WP_Query($args);
if($query->have_posts()):
while($query->have_posts()):$query->the_post();
$rst[] = $post;
endwhile;
wp_reset_postdata();
$offset = $_POST['offset']+2;
endif;
wp_send_json_success(array('post'=>$rst, 'offset'=>$offset));
}
wp_ajax_nopriv_(action) выполняется для пользователей, которые не авторизованы. wp_ajax_(action) выполняется для пользователей, которые авторизованы.
Вы можете использовать ответ запроса как вам угодно. Надеюсь, это поможет!
