@OneTwoThreeFourFive

В чём ошибка в ajax загрузка постов с фильтром категории wordpress?

Здравствуйте. Я пытаюсь сделать загрузку постов с 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 постов).

То есть я не могу сообщить кнопке "загрузить ещё" о том, что уже посты получены и их надо исключить из следующего запроса.
  • Вопрос задан
  • 780 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы