You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WordPress现有AJAX加载更多功能中添加AJAX分类筛选

解决WordPress分类筛选与AJAX加载更多协同工作问题

我来帮你搞定这个问题,核心思路是让分类筛选触发AJAX请求更新文章列表,同时同步更新加载更多的查询参数,这样筛选后加载更多就能基于当前分类继续请求内容了。下面是具体的修改步骤:

1. 修改分类筛选链接(停止跳转,添加分类ID标记)

先把你we_title_filters函数里的分类链接改成不跳转的形式,同时给每个链接加上分类ID的data属性,方便前端获取:

function we_title_filters() {
	if(is_home()): ?>
	<div class="title-filters">
		<h3 class="widget-title" style="display:inline-block;">Latest News</h3>
		<div class="filters">
			<?php
			$include = array(3651, 7, 2828, 2829, 2172);
			$categories = get_categories( array(
				'orderby' => 'name',
				'parent' => 0,
				'include' => $include
			) );
			// 顶部筛选链接
			foreach ( $categories as $category ) {
				printf( '<a href="javascript:void(0)" data-category-id="%1$s" class="single-filter">%2$s</a>',
					esc_attr( $category->term_id ),
					esc_html( $category->name )
				);
			}
			?>
			<div class="dropdown" style="float:right;">
				<span class="dropbtn">More</span>
				<ul class="more-list">
					<?php
					// 下拉菜单里的筛选链接(复用已获取的分类数据,不用重复查询)
					foreach ( $categories as $category ) {
						printf( '<li><a href="javascript:void(0)" data-category-id="%1$s" class="single-filter">%2$s</a></li>',
							esc_attr( $category->term_id ),
							esc_html( $category->name )
						);
					}
					?>
				</ul>
			</div>
		</div>
	</div>
	<?php endif;
}

2. 修改后端AJAX处理函数(支持分类参数,返回总页数)

更新sn_infinite_scroll_ajax函数,让它能接收分类ID参数,同时计算并返回当前分类下的总可加载页数,方便前端判断是否还有更多内容:

add_action( 'wp_ajax_sn_infinite_scroll_ajax', 'sn_infinite_scroll_ajax' );
add_action( 'wp_ajax_nopriv_sn_infinite_scroll_ajax', 'sn_infinite_scroll_ajax' );
function sn_infinite_scroll_ajax() {
	if ( ! is_singular() ) {
		check_ajax_referer( 'be-load-more-nonce', 'nonce' );
		$excluded_ids = get_field('top_stories', 'option'); // 修复option的引号问题
		$args = isset( $_POST['query'] ) ? array_map( 'esc_attr', $_POST['query'] ) : array();
		$args['post_type'] = isset( $args['post_type'] ) ? esc_attr( $args['post_type'] ) : 'post';
		$args['paged'] = esc_attr( $_POST['page'] );
		$args['post_status'] = 'publish';
		$args['post__not_in'] = $excluded_ids;

		// 新增:处理分类筛选参数
		if ( isset( $args['category'] ) && ! empty( $args['category'] ) ) {
			$args['cat'] = esc_attr( $args['category'] );
		}

		$pageType = esc_attr( $_POST['pageType'] );
		if ( $pageType == "is-home" ) {
			$initial = 30;
			$ppp = 30;
			$columns = 3;
		} else {
			$initial = 30;
			$ppp = 30;
			$columns = 3;
		}
		$args['posts_per_page'] = $ppp;
		$args['offset'] = $initial + ( $ppp * ( $_POST['page'] ) );

		ob_start();
		$loop = new WP_Query( $args );
		if( $loop->have_posts() ):
			while( $loop->have_posts() ): $loop->the_post();
				sn_post_summary( $loop->current_post, $columns );
			endwhile;
		endif;
		wp_reset_postdata();

		$data = ob_get_clean();
		// 计算总可加载页数(基于offset和每页数量)
		$total_posts = $loop->found_posts;
		$posts_after_initial = $total_posts - $initial;
		$maxpage = $posts_after_initial > 0 ? ceil( $posts_after_initial / $ppp ) : 0;

		// 返回文章HTML和总页数
		wp_send_json_success( array(
			'data' => $data,
			'maxpage' => $maxpage
		) );
	}
	wp_die();
}

3. 更新前端JS(处理筛选点击,同步加载更多参数)

修改你的load-more.js,添加分类筛选的AJAX逻辑,同时更新加载更多的参数,确保筛选后加载更多基于当前分类请求:

jQuery(document).ready(function() {
    // 初始化当前页码
    beloadmore.currentPage = 0;

    // 分类筛选点击事件
    jQuery(document).on('click', '.single-filter', function(e) {
        e.preventDefault();
        const categoryId = jQuery(this).data('category-id');
        const $postContainer = jQuery('.your-post-container'); // 替换成你实际的文章容器选择器
        const $loadMoreBtn = jQuery('.load-more-btn'); // 替换成你的加载更多按钮选择器

        // 添加加载状态
        $postContainer.addClass('loading');
        $loadMoreBtn.hide();

        // 发送AJAX请求获取分类文章
        jQuery.ajax({
            url: beloadmore.url,
            type: 'POST',
            data: {
                action: 'sn_infinite_scroll_ajax',
                nonce: beloadmore.nonce,
                query: {
                    category: categoryId,
                    post_type: 'post'
                },
                page: 0,
                pageType: 'is-home'
            },
            success: function(response) {
                if (response.success) {
                    // 替换现有文章列表
                    $postContainer.html(response.data);
                    // 更新全局查询参数(关键!让加载更多用这个分类)
                    beloadmore.query = {
                        category: categoryId,
                        post_type: 'post'
                    };
                    // 重置页码和总页数
                    beloadmore.currentPage = 0;
                    beloadmore.maxpage = response.maxpage;

                    // 控制加载更多按钮显示
                    if (beloadmore.currentPage < beloadmore.maxpage) {
                        $loadMoreBtn.show().text('Load More').prop('disabled', false);
                    } else {
                        $loadMoreBtn.hide().text('No more posts');
                    }
                }
                $postContainer.removeClass('loading');
            },
            error: function() {
                $postContainer.removeClass('loading');
                alert('Failed to load posts.');
            }
        });
    });

    // 加载更多点击事件(更新为使用全局参数)
    jQuery(document).on('click', '.load-more-btn', function(e) {
        e.preventDefault();
        const $btn = jQuery(this);
        const nextPage = beloadmore.currentPage + 1;

        // 判断是否还有更多页
        if (nextPage >= beloadmore.maxpage) {
            $btn.text('No more posts').prop('disabled', true);
            return;
        }

        $btn.text('Loading...').prop('disabled', true);

        jQuery.ajax({
            url: beloadmore.url,
            type: 'POST',
            data: {
                action: 'sn_infinite_scroll_ajax',
                nonce: beloadmore.nonce,
                query: beloadmore.query, // 使用更新后的查询参数
                page: nextPage,
                pageType: 'is-home'
            },
            success: function(response) {
                if (response.success) {
                    // 追加新文章
                    jQuery('.your-post-container').append(response.data);
                    // 更新当前页码
                    beloadmore.currentPage = nextPage;

                    // 更新按钮状态
                    if (beloadmore.currentPage >= beloadmore.maxpage - 1) {
                        $btn.text('No more posts').prop('disabled', true);
                    } else {
                        $btn.text('Load More').prop('disabled', false);
                    }
                } else {
                    $btn.text('Load More').prop('disabled', false);
                    alert('Failed to load posts.');
                }
            },
            error: function() {
                $btn.text('Load More').prop('disabled', false);
                alert('Failed to load posts.');
            }
        });
    });
});

4. 关键注意事项

  • 替换JS中的.your-post-container为你实际存放文章的容器选择器(比如你的文章列表放在<div class="post-grid">里,就改成.post-grid)
  • 替换.load-more-btn为你加载更多按钮的实际类名
  • 如果你的首页初始文章数量不是30,要同步修改$initial和$ppp的值,确保前后端逻辑一致

这样修改后,用户点击分类时会通过AJAX加载对应分类的文章,加载更多按钮会自动适配当前分类,继续加载该分类下的下一页内容,完美实现二者协同工作!

内容的提问来源于stack exchange,提问作者user2115227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:37:54