我做过帖子过滤器,这是有效的。
我也对帖子进行了分页,但如果我想在当前页面上过滤帖子,我的代码就不再有用了。
所以我有分页,如果我过滤第1页中的帖子,那么过滤掉所有页面中的所有帖子
例如,我在第一页有Post 1和Post 2,在第二页有Post 3
如果过滤条件要求适合Post 1和Post 3,我只需要看Post 1,因为我在第一页,而Post 3在第二页。
现在它显示了Post 1和Post 3,即使我在第一页
也许有任何建议如何处理这个?
index.php代码:
<?php wp_dropdown_categories('show_option_none=Select category&show_option_all=&name=cat1');
?>
<?php wp_dropdown_categories('show_option_none=Select category&show_count=0&orderby=name&echo=1&taxonomy=initiative&name=cat2');
?>
<?php
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
'post_status' => 'publish',
'paged' => $paged
);
$posts = new WP_Query( $args );
if ( $posts->have_posts() ) :
?>
<?php while( $posts->have_posts() ) : $posts->the_post() ?>
<?php get_template_part('content'); ?>
<?php endwhile; ?>
<?php else : ?>
<?php get_template_part('content','none'); ?>
<?php endif; ?>
<?php $big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $posts->max_num_pages
) );
?>
<?php
wp_reset_postdata();
?>
JS代码:
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
var currentPage = <?php echo $paged; ?> ;
(function($) {
$(document).ready(function(){
$('form.posts-filter select').change(function(){
$.ajax({
type:"POST",
url: ajaxurl,
data:$('form.posts-filter').serialize()+'&paged='+currentPage+'&action=filter_posts', //only input
success: function(response){
$("#main-content .container").html(response);
},
beforeSend: function(){
$('.loader').show(),
$('.loader-fade').show()
},
complete: function(){
$('.loader').hide(),
$('.loader-fade').hide()
}
});
});
});
})(jQuery);
functions.php代码:
add_action('wp_ajax_filter_posts', 'filter_my_posts');
add_action('wp_ajax_nopriv_filter_posts', 'filter_my_posts');
function filter_my_posts(){
$filterId = $_POST['cat1'];
$filterId2 = $_POST['cat2'];
$relation = '';
if (($filterId == '-1') || ($filterId2 == '-1')){
$relation = 'OR';
} else {
$relation = 'AND';
}
if ( isset($_POST['paged']) ) {
$page = $_POST['paged'];
} else {
$page = 1;
}
$args = array(
'post_type' => 'post',
'paged' => $page,
'tax_query' => array(
'relation' => $relation,
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => $filterId
),
array(
'taxonomy' => 'initiative',
'field' => 'term_id',
'terms' => $filterId2
)
)
);
if (($filterId == "-1") && ($filterId2 == "-1")){
unset($args['tax_query']);
}
$posts = query_posts($args);
if(have_posts()){
while(have_posts()){ the_post();
get_template_part('content');
}
}
wp_reset_postdata();
die();
};
答案 0 :(得分:0)
如果你想以这种方式过滤帖子抛出ajax,你必须将post_ids从第一页发送到你的过滤器函数,然后告诉WP只从它们返回结果。
因此,在Const ReservedAddresses() As Byte = {10, 12, 75} 'I wish...
函数中的args必须放入filter_my_posts
这一行:
$args
因为否则WP只知道必须返回特定数量的帖子(在你的情况下为2),当然,如果POST1和POST3匹配,它将返回这两个。
我不知道你的过滤器必须做什么,但是在页面中已经有你的所有帖子之后你可以考虑使用像这样的js排序例如uikit(过滤部分)并避免额外的请求服务器和数据库。
答案 1 :(得分:0)
在posts_per_page
查询中设置$args
怎么样?
$args = array(
'post_status' => 'publish',
'paged' => $paged,
'posts_per_page' => 10,
);