【问题标题】:How to use FacetWP to search on category branches?如何使用 FacetWP 搜索分类分支?
【发布时间】:2016-08-11 11:04:13
【问题描述】:

我正在一个网站上工作,我的帖子分配了多个类别和子类别。现在我想使用 FacetWP 让用户可以选择在他们的类别和子类别中搜索这些帖子。我希望它像以下示例一样分层工作。

假设一篇帖子分配了以下类别:

France  - Paris   - River
                  - Street
        - Lyon    - Street
                  - House
Germany - Hamburg - Street
        - Berlin  - House
                  - Church

现在我想创建下拉分面,我希望第一个下拉菜单仅提供主要类别(在本例中为国家/地区)。之后,当有人选择了一个国家/地区时,我想要第二个下拉列表仅显示该特定国家/地区的子类别(在本例中为城市)。之后,我希望下一个下拉菜单仅显示子子类别。

因此,当有人选择法国时,下一个下拉菜单应该只显示巴黎和里昂(而不是汉堡和柏林)。选择巴黎后,下一个下拉菜单应仅显示 River 和 Street(而不是 House 或 Church)

FacetWP 可以做到这一点吗?或者有没有办法对其进行调整以使其成为可能?

【问题讨论】:

    标签: wordpress faceted-search facetwp


    【解决方案1】:

    您必须创建 3 个方面,每个类别级别一个。

    那么您将不得不使用facetwp_facet_html 过滤器。

    这是一个例子,我使用select2 facet

    ```

    function fwp_limit_subcategory( $output, $params ) {
    
      $facet = $params['facet'];
      if ($facet['type'] != 'select2') { return $output; }
    
      $custom_out = $out = '';
      $exploded = explode('<option', $output);
    
    
    if ( 'subcategory' == $facet['name'] ) {
    
        // See if a category is selected
        foreach ( FWP()->facet->facets as $f ) {
    
            if ( 'category' == $f['name'] && empty( $f['selected_values'] ) ) {
              return $exploded[0].'</select>';
            }
    
            if ( 'category' == $f['name'] && ! empty( $f['selected_values'] ) ) {
    
                $term_slugs = $f['selected_values'];
    
                foreach($term_slugs as $term_slug) {
    
                  $term = get_term_by( 'slug', $term_slug, 'category' );
                  if ( isset( $term->term_id ) ) {
    
                      $get_terms = get_terms(
                        array(
                          'parent' => $term->term_id, 
                          'taxonomy' => 'category',
                          'hierarchical' => true
                        )
                      );
                      foreach ($exploded as $opt) {
                        foreach($get_terms as $child) {
                          if (strpos($opt, $child->slug) !== false) {
                            $custom_out .= '<option '. $opt;
                          }
                        }
    
                      }
    
    
    
                  }
                }
    
            }
        }
      }
    }
    
    if ($custom_out != '') { 
      $out .= $exploded[0].$custom_out;
      if (strpos($out, '</select>') === false) {
        $out .= '</select>';
      }
      return $out; 
    
    
    return $output;
    
    }
    add_filter( 'facetwp_facet_html', 'fwp_limit_subcategory', 10, 2 );
    

    ```

    我希望这对您有所帮助并让您走上正轨。

    编辑

    我发现了另一个可能也有帮助的解决方案。

    1. Index top only categories in one facet
    2. Index child only categories in another facet
    3. Tweak the results of the second facet according to the result of the first one
    4. 重复第三、第四方面等

    【讨论】:

    • 感谢您的回复。我使用了另一种解决方案。我使用了层次结构方面,它足以解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多