首先html的button里面要加载data-category=category_id 的参数:
<button class="category-button" data-category="1">Category 1</button> <button class="category-button" data-category="2">Category 2</button> <button class="category-button" data-category="3">Category 3</button>
然后创建jquery的ajax文件来发送ajax:
jQuery(document).ready(function($) { $('.category-button').click(function() { var category = $(this).data('category'); $.ajax({ url: '/wp-admin/admin-ajax.php', type: 'POST', data: { action: 'fetch_category_posts', category: category }, success: function(response) { // Do something with the response, like appending the posts to a container $('#posts-container').html(response); } }); }); });
然后在functions.php里面创建wp_ajax的回调参数来输出response到js.
add_action( 'wp_ajax_fetch_category_posts', 'fetch_category_posts' ); add_action( 'wp_ajax_nopriv_fetch_category_posts', 'fetch_category_posts' ); function fetch_category_posts() { $category = $_POST['category']; $args = array( 'category' => $category, 'posts_per_page' => -1, ); $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // Do something with the post, like displaying its title and content the_title(); the_content(); } wp_reset_postdata(); } die(); }
要处理loadmore按钮,可以向按钮添加一个单击事件处理程序,并发出另一个AJAX请求以获取更多帖子。在本例中,我们将假设loadmore按钮具有类“loadmore”
jQuery(document).ready(function($) { $('.load-more').click(function() { var offset = $('.post').length; $.ajax({ url: '/wp-admin/admin-ajax.php', type: 'POST', data: { action: 'fetch_more_posts', category: category, offset: offset }, success: function(response) { // Do something with the response, like appending the posts to a container $('#posts-container').append(response); } }); }); });
要在服务器端处理loadmore按钮,您需要创建另一个函数来处理这个AJAX请求。此函数应该与您之前创建的函数类似,但有一些不同。您需要向查询中添加偏移量参数,还需要添加一种方法来控制每页的帖子数。
add_action( 'wp_ajax_fetch_more_posts', 'fetch_more_posts' ); add_action( 'wp_ajax_nopriv_fetch_more_posts', 'fetch_more_posts' ); function fetch_more_posts() { $category = $_POST['category']; $offset = $_POST['offset']; $posts_per_page = 10; //number of posts to be loaded per request $args = array( 'category' => $category, 'posts_per_page' => $posts_per_page, 'offset' => $offset ); $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // Do something with the post, like displaying its title and content the_title(); the_content(); } wp_reset_postdata(); } die(); }