2016-01-18 2 views
0

У меня есть фильтр сообщений, который работает. Также я сделал разбивку на страницы для сообщений, но если я хочу фильтровать сообщения только на текущей странице, мой код больше не работает.

Так что у меня есть разбиение на страницы, и если я фильтрую сообщения на странице 1, тогда фильтруйте все сообщения со всех страниц.
Например, у меня есть сообщение 1 и сообщение 2 на первой странице и сообщение 3 на второй странице.
Если условия условия фильтра подходят для сообщений 1 и 3, мне нужно увидеть только сообщение 1, потому что я на первой странице, а пост 3 - на второй странице. Теперь он показывает сообщение 1 и сообщение 3, даже если я на первой странице.
Возможно, какие-либо предложения, как справиться с этим?Сообщения с фильтром WordPress с использованием ajax на определенной странице

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

Если вы хотите фильтровать сообщения бросить Аякса этот путь, вам должен отправить post_ids с первой страницы в функцию фильтра, а затем сообщить WP, чтобы он возвращал результат только от них.

Таким образом, в ваших арг в filter_my_posts функции должны поставить в $args эту строку:

'post__in' => array($post1_id, $post2_id) 

, потому что в противном случае WP только знает, что должен возвращать определенное число сообщений (2 в вашем случае) и, конечно же, если POST1 и POST3, он вернет эти два.

Я не знаю, что должен сделать ваш фильтр, но после того, как все ваши сообщения уже на странице, возможно, вы можете рассмотреть возможность сортировки js, например, uikit (разделы фильтрации) и избежать дополнительных запросов к серверу и БД ,

+0

Это работает, но не так, как мне нужно. WP по-прежнему возвращает все сообщения, для которых требуется условие фильтра, но WP не понимает, что я хочу фильтровать только текущие сообщения по страницам e.x. на странице 1 мне нужно отфильтровать сообщения только со страницы 1, но WP занимает сообщения со всех страниц и возвращает их. –

Смежные вопросы