【问题标题】:Category filter with 3 categories具有 3 个类别的类别过滤器
【发布时间】:2019-12-11 22:19:07
【问题描述】:

我有一个 WordPress 查询并按类别使用复选框进行过滤:

if( isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell'])  ) {
    $args['tax_query'][] = array(
        array(
            'taxonomy' => 'category',
            'field' => 'id',
            'terms' => $_POST['vertragsart']
        ),
        array(
            'taxonomy' => 'category',
            'field' => 'id',
            'terms' => $_POST['zeitmodell']
        ),
    );

} elseif( !isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell'])  ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['zeitmodell']
    );

} elseif( isset( $_POST['vertragsart'] ) && !isset ($_POST['zeitmodell'])  ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['vertragsart']
    );
}

这可以正常工作。在页面加载时,他会向我显示所有结果,并且用户可以使用复选框来限制结果。

现在我想添加第三个类别过滤器 - 知道怎么做吗?我认为它会更复杂,因为它比 if/else 更复杂。

我试过了,但是当涉及到第三个过滤器时,它只会显示所有内容:

if( isset( $_POST['vertragsart'] ) && !isset ($_POST['zeitmodell']) && isset ($_POST['fachbereich'])  ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['vertragsart']
    );      
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['fachbereich']
    );      
} elseif( isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell']) && !isset ($_POST['fachbereich'])  ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['vertragsart']
    );
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['zeitmodell']
    );
} elseif( isset( $_POST['vertragsart'] ) && !isset ($_POST['zeitmodell']) && isset ($_POST['fachbereich'])  ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['vertragsart']
    );
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['fachbereich']
    );



} elseif( !isset( $_POST['vertragsart'] ) && !isset ($_POST['zeitmodell']) && isset ($_POST['fachbereich'])  ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['fachbereich']
    );
} elseif( isset( $_POST['vertragsart'] ) && !isset ($_POST['zeitmodell']) && !isset ($_POST['fachbereich'])  ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['vertragsart']
    );  
} elseif( !isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell']) && !isset ($_POST['fachbereich'])  ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => $_POST['zeitmodell']
    );


// this won't work
} elseif( isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell']) && isset ($_POST['fachbereich'])  ) {
    $args['tax_query'][] = array(
        array(
            'taxonomy' => 'category',
            'field' => 'id',
            'terms' => $_POST['vertragsart']
        ),
        array(
            'taxonomy' => 'category',
            'field' => 'id',
            'terms' => $_POST['zeitmodell']
        ),
        array(
            'taxonomy' => 'category',
            'field' => 'id',
            'terms' => $_POST['fachbereich']
        ),
    );
}

【问题讨论】:

    标签: wordpress filter


    【解决方案1】:

    似乎是重复代码,我会推荐这样的:

    // first, set categories
    $categories = array('vertragsart', 'zeitmodell', 'third_code');
    
    foreach ($categories as $cat) {
        // if category is checked
        if (isset($_POST[$cat]) {
                // if $cats_array is assigned already, add category array, else, create $cats_array
            if (isset($cats_array)) {
                array_push(
                    $cats_array, array(
                            'taxonomy' => 'category',
                            'field' => 'id',
                            'terms' => $_POST[$cat]
                    )
                );
            } else {
                $cats_array = array(
                array(
                            'taxonomy' => 'category',
                            'field' => 'id',
                            'terms' => $_POST[$cat]
                    )
                );
            }
        }
    }
    
    if (isset($cats_array) && is_array($cats_array)) {
        $args['tax_query'][] = $cats_array;
    }
    

    编辑:

    更好的代码,可能会使用超过 2 个:

    $categories = array('vertragsart', 'zeitmodell', 'third_code');
    
    foreach ($categories as $cat) {
        // if category is checked
        if (isset($_POST[$cat]) {
          if (isset($cats)) {
                        $cats .= ',' $cat;
                    } else {
                        $cats = $cat;
                    }
        }
    }
    
    if (isset($cats)) {
        $args['category_name'] = $cats;
    }
    

    【讨论】:

      【解决方案2】:

      一种方法是包含所有可能的组合,如下所示:

      if( isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell']) && isset ($_POST['third_category'])  ) {
          $args['tax_query'][] = array(
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['vertragsart']
              ),
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['zeitmodell']
              ),
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['third_category']
              ),
          );
      
      } elseif( isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell']) && !isset ($_POST['third_category'])   ) {
          $args['tax_query'][] = array(
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['vertragsart']
              ),
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['zeitmodell']
              ),
          );
      
      } elseif( isset( $_POST['vertragsart'] ) && !isset ($_POST['zeitmodell']) && isset ($_POST['third_category'])  ) {
          $args['tax_query'][] = array(
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['vertragsart']
              ),
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['third_category']
              ),
          );
      } elseif( !isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell']) && isset ($_POST['third_category'])   ) {
          $args['tax_query'][] = array(
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['zeitmodell']
              ),
              array(
                  'taxonomy' => 'category',
                  'field' => 'id',
                  'terms' => $_POST['third_category']
              ),
          );
      
      } elseif( isset( $_POST['vertragsart'] ) && !isset ($_POST['zeitmodell']) && !isset ($_POST['third_category'])  ) {
          $args['tax_query'][] = array(
              'taxonomy' => 'category',
              'field' => 'id',
              'terms' => $_POST['vertragsart']
          );
      } elseif( !isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell']) && !isset ($_POST['third_category'])  ) {
          $args['tax_query'][] = array(
              'taxonomy' => 'category',
              'field' => 'id',
              'terms' => $_POST['zeitmodell']
          );
      } elseif( !isset( $_POST['vertragsart'] ) && !isset ($_POST['zeitmodell']) && isset ($_POST['third_category'])  ) {
          $args['tax_query'][] = array(
              'taxonomy' => 'category',
              'field' => 'id',
              'terms' => $_POST['third_category']
          );
      }
      

      我必须承认,这是相当重复的编码。如果它保持 3 个类别,则上述工作正常。否则,您可以寻找更动态的方法。

      【讨论】:

      • 嗨,是的,我也试过这个,但我认为if( isset( $_POST['vertragsart'] ) && isset ($_POST['zeitmodell']) && isset ($_POST['fachbereich']) ) { ... 会导致全部显示。
      • 而且不是所有的帖子都属于这3个类别吗?
      猜你喜欢
      • 2012-07-29
      • 2015-02-25
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多