嵌套的 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' => '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 术语列表 - 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
如何通过分类术语从自定义 WordPress MySQL 查询中排除结果