3

我使用插件 CPT UI 在 Wordpress 中制作了自定义术语分类法。所以我可以将“产品类别”添加到我的自定义帖子类型“产品”中。我们有父类和子类。例如:

*Toegangs控制

  • 电子老虎机
  • 软件
  • 流浪者

*明镜

  • 明镜
  • ...

等等

所以我创建了一个新页面“page-products”来显示所有产品。此页面必须包含基于产品类别的过滤器。

我猜这个页面由 2 个“循环”组成。一个用于过滤器,一个用于产品。

产品循环

<?php $args = array('post_type' => 'product'); ?>
<?php $loop = new WP_Query($args); ?>
<?php if ( $loop->have_posts() ) : while ( $loop->have_posts() ) : $loop->the_post(); ?>

    <?php get_template_part( 'loop-templates/content-product' ); ?>

<?php endwhile; ?>
<?php else: ?>
                <h1>
                    <?php
                        _e('Geen producten gevonden','axces-theme');
                    ?>
                </h1>
 <?php endif; ?>
 <?php wp_reset_postdata(); ?>

条款//过滤器*

                <?php
                    $args = array('hide_empty' => false, 'orderby' => 'term_group', 'parent' => false);
                    $terms = get_terms('product_categorie', $args);
                    $hierarchy = _get_term_hierarchy('product_categorie');
                    echo '<ul class="filter">';
                    foreach ($terms as $term) {
                      echo '<li class="parent"><strong class="parent__item">'.$term->name.'</strong>';
                      if (array_key_exists($term->term_id, $hierarchy)) {
                        echo '<ul class="childs">';
                        foreach ($hierarchy[$term->term_id] as $v) {
                          $child = get_term($v);
                          echo '<li class="child" data-filter="'.$child->slug.'">'.$child->name.'</li>';
                        }
                        echo '</ul>';
                      }
                      echo '</li>';
                    }
                    echo '</ul>';
                ?>

但是这样的结果是不对的。我想要一个嵌套列表。像这样:

<ul>
    <li class="parent">Toegangscontroles
        <ul>
            <li class="child">Software</li>
            <li class="child">Wandlezer</li>
        </ul>
    </li>
    <li class="parent">Another parent term
        <ul>
            <li class="child">child term</li>
            <li class="child">child term</li>
        </ul>
    </li>
</ul>

所以总结了我的问题:

  1. 在 page-product.php 页面上创建过滤器
  2. 正确嵌套列表

谢谢!

4

4 回答 4

2

wp_terms_checklist'taxonomy' => 'taxonomy'参数一起使用。

$args = array(
    'descendants_and_self'  => 0,
    'selected_cats'         => false,
    'popular_cats'          => false,
    'walker'                => null,
    'taxonomy'              => 'your taxomonomy',
    'checked_ontop'         => true
);
 
<ul>
    <?php wp_terms_checklist(0, $args); ?>
</ul>
于 2021-04-28T13:09:15.837 回答
1

首先,您必须获取所有父类别,然后根据父 ID,您可以编写一个循环函数,为您提供给定 ID 的子类别。检查下面的代码。

function get_child_categories( $parent_category_id ){
    $html = '';
    $child_categories = get_categories( array( 'parent' => $parent_category_id, 'hide_empty' => false, 'taxonomy' => 'product_cat' ) );
    if( !empty( $child_categories ) ){
        $html .= '<ul>';
        foreach ( $child_categories as $child_category ) {
            $html .= '<li class="child">'.$child_category->name;
            $html .= get_child_categories( $child_category->term_id );
            $html .= '</li>';
        }
        $html .= '</ul>';
    }
    return $html;
}

function list_categories(){
    $html = '';
    $parent_categories = get_categories( array( 'parent' => 0, 'hide_empty' => false, 'taxonomy' => 'product_cat' ) );
    $html.= '<ul>';
    foreach ( $parent_categories as $parent_category ) {
        $html .= '<li class="parent">'.$parent_category->name;
        $html .= get_child_categories( $parent_category->term_id  );
        $html .= '</li>';
    }
    $html.= '</ul>';
    return $html;
}
add_shortcode( 'list_categories', 'list_categories' );

输出

  • A - 主要类别
    • B - 子类别
    • C - 子类别
      • D - 嵌套子类别(如果可用)
  • E - 主要类别
    • F - 子类别
    • G - 子类别
      • H - 嵌套子类别(如果可用)
于 2021-04-29T12:01:47.637 回答
1

HTML 在此处无效,但正确的解决方案是使用 _get_term_hierarchy() 函数

  $args = array('hide_empty' => 0, 'orderby' => 'term_group');
  $terms = get_terms('category', $args);
  $hierarchy = _get_term_hierarchy('category');
  echo '<ul>';
  foreach ($terms as $term) {
    echo '<li>'.$term->name;
    if (array_key_exists($term->term_id, $hierarchy)) {
      echo '<ul>';
      foreach ($hierarchy[$term->term_id] as $v) {
        $child = get_term($v);
        echo '<li>'.$child->name.'</li>';
      }
      echo '</ul>';
    }
    echo '</li>';
  }
  echo '</ul>';
于 2018-10-24T12:14:11.373 回答
0

这将输出为您的产品注册的分类法:

之后,您需要一个 foreach 或一些迭代器来获取每个分类的术语,例如:

<?php 

$taxonomies = get_object_taxonomies( 'Product', 'objects');

foreach($taxonomies as $taxonomy): ?>
  <h2> <?= $taxonomy->label ?> </h2>

  // Get all the single taxonomy terms
  $terms = get_terms( array(
    'taxonomy' => $taxonomy->name,
    'hide_empty' => false,
  ) );

  <ul>
    <?php foreach($terms as $term): ?>
      <li><?= $term->name ?></li>
     <?php endforeach; ?>
  </ul>


<?php endforeach; ?>
于 2018-10-24T11:05:52.883 回答