WordPress在特定页面使用ajax过滤帖子

时间:2016-01-18 14:27:07

标签: php jquery ajax wordpress post

我做过帖子过滤器,这是有效的。 我也对帖子进行了分页,但如果我想在当前页面上过滤帖子,我的代码就不再有用了。

所以我有分页,如果我过滤第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();
};

2 个答案:

答案 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,
);