使用复选框按多个分类法过滤帖子,然后选择

时间:2018-06-28 01:09:50

标签: javascript php wordpress

嘿,所以我会尽力让它快速。我试图使用选择下拉列表和复选框,以前端表单的两个不同分类法(城市和类别)过滤我的自定义帖子类型(景点)。目前,我的选择过滤器可以使用,但是我的复选框过滤器不能单独使用,也不能与选择下拉菜单一起使用。

Image

我试图用这篇文章来帮助我:https://rudrastyh.com/wordpress/ajax-post-filters.html

前端PHP表单

<form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
<!--            Cities select filter -->
        <?php
    if( $terms = get_terms( 'city', 'orderby=name' ) ) : // to make it simple I use default categories
        echo '<select value ="" name="cityfilter"><option>Select City...</option>';
        foreach ( $terms as $term ) :
            echo '<option value="' . $term->term_id . '">' . $term->name . '</option>'; // ID of the category as the value of an option
        endforeach;
        echo '</select>';
    endif;?>
<!--        Categories filter -->
        <div class="categories-list">
        <?php 
          $categories = get_categories(); 
          foreach ($categories as $category) {
            echo '<input type="checkbox" name="categoryfilter" value="'.$category->cat_ID.'"> '.$category->name.'<br />';
          }
        ?>
        </div>

            <button class="itenerary-filter">Apply filter</button>
<input type="hidden" name="action" value="myfilter">

    </form> 

Functions.php查询

function misha_filter_function(){
    $args = array(
        'orderby' => 'date', // we will sort posts by date
        'order' => $_POST['date'] // ASC или DESC
    );
    $relation = 'OR';
    if($_POST['categoryfilter'] == 'on' && isset( $_POST['cityfilter'] )) {
        $relation = 'AND';
    }
    if( isset( $_POST['cityfilter'] ) ||  (isset( $_POST['categoryfilter']) && $_POST['categoryfilter'] == 'on') )
        $args['tax_query'] = array(
            'relation' => $relation, 
            array(
                'taxonomy' => 'city',
                'field' => 'id',
                'terms' => $_POST['cityfilter']
            ),
            array(
                'taxonomy' => 'category',
                'field' => 'id',
                'terms' => $_POST['categoryfilter'],
            ),
        );

    $query = new WP_Query( $args );

    if( $query->have_posts() ) :
        while( $query->have_posts() ): $query->the_post();
            get_template_part('template_parts/loop_content','attractions');
        endwhile;
        wp_reset_postdata();
    else :
        echo 'No posts found';
    endif;

    die();
}


add_action('wp_ajax_myfilter', 'misha_filter_function'); 
add_action('wp_ajax_nopriv_myfilter', 'misha_filter_function');

JavaScript

$('#filter').submit(function(){
        var filter = $('#filter');
        $.ajax({
            url:filter.attr('action'),
            data:filter.serialize(), // form data
            type:filter.attr('method'), // POST
            beforeSend:function(xhr){
                filter.find('button').text('Processing...'); // changing the button label
            },
            success:function(data) {
                filter.find('button').text('Apply filter'); // changing the button label back
                $('#external-events-listing').html(data); // insert data
                $('#external-events-listing .feature-attraction').addClass('feature-attraction_itenerary ui-draggable ui-draggable-handle').removeClass('feature-attraction');
                $('.feature-attraction_itenerary .wrapper').addClass('wrapper_itenerary').removeClass('wrapper');
                $('#external-events .feature-attraction_itenerary').each(function() {
                        // store data so the calendar knows to render an event upon drop
                        $(this).data('event', {
                            title: $.trim($(this).text()),
                            // use the element's text as the event title
                            stick: true // maintain when user navigates (see docs on the renderEvent method)
                        });
                        // make the event draggable using jQuery UI
                        $(this).draggable({
                            zIndex: 999,
                            revert: true,
                            // will cause the event to go back to its
                            revertDuration: 0 //  original position after the drag
                        });
                });
            }
        });
        return false;
    });

任何帮助将不胜感激!

编辑:

所以我var_dump($ args);按照建议。我通过从下拉菜单中选择一个选项并选择一个复选框来获得此数组。问题是,选择两个关系都应为“ AND”时,关系不应为“ relation” =>“ OR”。我想做的是当两个过滤器都选择时,“或”应为“与”。反正有这样做吗?

array (size=3)
  'orderby' => string 'date' (length=4)
  'order' => null
  'tax_query' => 
    array (size=3)
      'relation' => string 'OR' (length=2)
      0 => 
        array (size=3)
          'taxonomy' => string 'city' (length=4)
          'field' => string 'id' (length=2)
          'terms' => string '6' (length=1)
      1 => 
        array (size=3)
          'taxonomy' => string 'category' (length=8)
          'field' => string 'id' (length=2)
          'terms' => string '7' (length=1)

1 个答案:

答案 0 :(得分:0)

您的代码中有一些错误。 categoryfilter没有获得“ on”值-因此您应该从if条件中将其删除。

在这里:

function misha_filter_function(){
    $args = array(
        'orderby' => 'date', // we will sort posts by date
        'order' => $_POST['date'] // ASC или DESC
    );
    $relation = 'OR';
    if(!empty($_POST['categoryfilter']) && isset( $_POST['cityfilter'] )) {
        $relation = 'AND';
    }
    if( isset( $_POST['cityfilter'] ) ||  !empty( $_POST['categoryfilter']) )
        $args['tax_query'] = array(
            'relation' => $relation, 
            array(
                'taxonomy' => 'city',
                'field' => 'id',
                'terms' => $_POST['cityfilter']
            ),
            array(
                'taxonomy' => 'category',
                'field' => 'id',
                'terms' => $_POST['categoryfilter'],
            ),
        );

    $query = new WP_Query( $args );

    if( $query->have_posts() ) :
        while( $query->have_posts() ): $query->the_post();
            get_template_part('template_parts/loop_content','attractions');
        endwhile;
        wp_reset_postdata();
    else :
        echo 'No posts found';
    endif;

    die();
}


add_action('wp_ajax_myfilter', 'misha_filter_function'); 
add_action('wp_ajax_nopriv_myfilter', 'misha_filter_function');