Здравствуйте. Я пытаюсь сделать загрузку постов с ajax с фильтром по категориям и кнопкой "загрузить ещё" следуя этим двум статьям:
https://rudrastyh.com/wordpress/ajax-load-more-wit...
https://rudrastyh.com/wordpress/ajax-post-filters.html
Я первой статье есть фильтры, но они там не по категории, а во 2 статье как раз фильтр с категориями. И вот что у меня получилось:
Function.php
add_action( 'wp_enqueue_scripts', 'misha_script_and_styles', 1 );
function misha_script_and_styles() {
global $wp_query;
// register our main script but do not enqueue it yet
wp_register_script( 'misha_scripts', get_stylesheet_directory_uri() . '/script.js', array('jquery'), time() );
// now the most interesting part
// we have to pass parameters to myloadmore.js script but we can get the parameters values only in PHP
// you can define variables directly in your HTML but I decided that the most proper way is wp_localize_script()
wp_localize_script( 'misha_scripts', 'misha_loadmore_params', array(
'ajaxurl' => site_url() . '/wp-admin/admin-ajax.php', // WordPress AJAX
'posts' => json_encode( $wp_query->query_vars ), // everything about your loop is here
'current_page' => $wp_query->query_vars['paged'] ? $wp_query->query_vars['paged'] : 1,
'max_page' => $wp_query->max_num_pages
) );
wp_enqueue_script( 'misha_scripts' );
}
add_action('wp_ajax_loadmore', 'misha_loadmore_ajax_handler'); // wp_ajax_{action}
add_action('wp_ajax_nopriv_loadmore', 'misha_loadmore_ajax_handler'); // wp_ajax_nopriv_{action}
function misha_loadmore_ajax_handler(){
// prepare our arguments for the query
$args = json_decode( stripslashes( $_POST['query'] ), true );
$args['paged'] = $_POST['page'] + 1; // we need next page to be loaded
$args['post_status'] = 'publish';
// it is always better to use WP_Query but not here
query_posts( $args );
if( have_posts() ) :
// run the loop
while( have_posts() ): the_post();
get_template_part( 'template-parts/post/content', get_post_format() );
endwhile;
endif;
die; // here we exit the script and even no wp_reset_query() required!
}
add_action('wp_ajax_myfilter', 'misha_filter_function');
add_action('wp_ajax_nopriv_mishafilter', 'misha_filter_function');
function misha_filter_function(){
// for taxonomies / categories
if( isset( $_POST['categoryfilter1'] ) )
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'field' => 'id',
'terms' => $_POST['categoryfilter1']
)
);
$query = new WP_Query( $args );
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
get_template_part( 'template-parts/post/content', get_post_format() );
endwhile;
wp_reset_postdata();
else :
echo 'No posts found';
endif;
die();
}
Java Script
jQuery(function($){
/*
* Load More
*/
$('#misha_loadmore').click(function(){
$.ajax({
url : misha_loadmore_params.ajaxurl, // AJAX handler
data : {
'action': 'loadmore', // the parameter for admin-ajax.php
'query': misha_loadmore_params.posts, // loop parameters passed by wp_localize_script()
'page' : misha_loadmore_params.current_page, // current page
},
type : 'POST',
beforeSend : function ( xhr ) {
$('#misha_loadmore').text('Loading...'); // some type of preloader
},
success : function( data ){
if( data ) {
$('#misha_loadmore').text( 'More posts' );
$('#misha_posts_wrap').append(data); // insert new posts
misha_loadmore_params.current_page++;
if ( misha_loadmore_params.current_page == misha_loadmore_params.max_page )
$('#misha_loadmore').hide(); // if last page, HIDE the button
} else {
$('#misha_loadmore').hide(); // if no data, HIDE the button as well
}
}
});
return false;
});
});
jQuery(function($){
$('#filter1').submit(function(){
var filter = $('#filter1');
$.ajax({
url:filter.attr('action'),
data:filter.serialize(), // form data
type:filter.attr('method'), // POST
beforeSend:function(xhr){
filter.find('button').text('Processing...'); // changing the button label
},
success:function(data){
filter.find('button').text('Apply filter'); // changing the button label back
$('#misha_posts_wrap').html(data); // insert data
}
});
return false;
});
});
Когда я загружаю страницу показываются посты как обычно. Есть фильтр с категориями (я его сюда не написал, там просто html) и кнопка "загрузить ещё". Фильтр работает. Я выбрал категорию и посты вышли только из нужной категории. Но когда я нажимаю "загрузить ещё", показываются снова те же самые посты и так бесконечно.
Например: у меня есть категория "Categoryname" и в ней 3 поста. Выбираю эту категорию в фильтре, нажимаю "принять фильтр", показываются 3 поста из этой категории и снизу кнопка "загрузить ещё" (хотя её не должно быть так как постов больше нет) и если на неё нажать, покажет эти же самые 3 поста. Нажму ещё раз и снова уже ниже показывает 3 поста (то есть копирует их и на странице уже 9 постов).
То есть я не могу сообщить кнопке "загрузить ещё" о том, что уже посты получены и их надо исключить из следующего запроса.