Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用复选框按多个分类法筛选帖子,然后选择_Javascript_Php_Wordpress - Fatal编程技术网

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

Javascript 使用复选框按多个分类法筛选帖子,然后选择,javascript,php,wordpress,Javascript,Php,Wordpress,嘿,我会尽量快点的。我试图在前端表单中使用选择下拉列表和复选框,用两种不同的分类法(城市和类别)过滤我的自定义帖子类型(景点)。目前,我的选择过滤器可以工作,但我的复选框过滤器不能单独工作,也不能与选择下拉菜单一起工作 我试图用这篇文章来帮助我: 前端PHP表单 <form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter"> <!--

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

我试图用这篇文章来帮助我:

前端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> 
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);正如建议的那样。我通过从下拉列表中选择一个选项并选中一个复选框来获得这个数组。问题是,关系不应该是'relation'=>'或'relation',当选择两者时,它应该是'AND'。我希望能够做到的是,当两个过滤器都选择“或”应该“和”时。有没有办法这样做

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)

您的代码中有一些错误。 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');

您的代码需要调试。由于时间太长,不容易发现哪里出了问题。只需调试它并进行一些澄清。F.e.var_dump($args);在$query=new WP_query($args);-并将输出数据粘贴到您的问题我添加了输出的数据…当单击我的复选框时,我的关系似乎没有从“或”更改为“和”。有什么我可以解决的吗?好的,我正在添加答案。这真的很接近我需要的。唯一的问题是,如果自己选择了两个复选框(在我的示例中是餐厅和旅游景点),那么只会显示其中一个类别。是否还有其他方法可以实现?请尝试在HTML代码中用name=“categoryfilter[]”替换name=“categoryfilter”。
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');