嵌套的 wordpress 术语列表 - 过滤器

Posted

技术标签:

【中文标题】嵌套的 wordpress 术语列表 - 过滤器【英文标题】:Nested wordpress terms list - filter 【发布时间】:2019-03-28 18:11:39 【问题描述】:

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

*Toegangs 控制

电子开槽 软件 流浪者

*明镜

Verlichte spiegels ...

等等

所以我创建了一个新页面“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>

所以总结了我的问题:

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

谢谢!

【问题讨论】:

我已经用工作代码编辑了我的术语循环。 【参考方案1】:

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

之后,您需要一个 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; ?>

【讨论】:

这只是显示一个 ul,其中包含 项中的所有术语。子级没有嵌套在父级中。【参考方案2】:

此处的 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>';

【讨论】:

几乎... :-) 这显示了父类别和嵌套的子类别。但比我显示与父母相同的子类别。之后它进入下一个父类别 “但我显示的子类别与父母相同” - 抱歉,我没听懂 但猜测你可以尝试将 $args 编辑为 $args = array('hide_empty' => 0, 'orderby' => 'term_group', 'parent' => 0);【参考方案3】:

wp_terms_checklist'taxonomy' =&gt; '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>

【讨论】:

@emesonthis 在这种情况下你可以试试wp_terms_checklist 是的!这正是我一直在寻找的。如果你更新你的答案,我会奖励你。【参考方案4】:

首先,您必须获取所有父类别,然后根据父 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 - 嵌套子类别(如果可用)

【讨论】:

以上是关于嵌套的 wordpress 术语列表 - 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

PHP Wordpress:逗号分隔的分类术语列表

php Wordpress - 以逗号分隔的帖子术语列表

Wordpress:术语链接跳过存档页面并直接转到最新帖子

如何通过分类术语从自定义 WordPress MySQL 查询中排除结果

在 wordpress 存档下拉列表中显示嵌套月份中的帖子和计数器

php WordPress |类别过滤器下拉列表