问题描述
我有一个分层分类称为’geographical locations’ 。它包含一级大陆,然后是每个国家。示例:
Europe
- Ireland
- Spain
- Sweden
Asia
- Laos
- Thailand
- Vietnam
等等
使用 get_terms() 我设法输出完整的术语列表,但是大陆与国家混在一起,在一个大的平面列表中。
如何输出如上所述的分层列表?
最佳解决方案
使用 wp_list_categories
与分类参数,它用于创建层次类别列表,但也支持使用自定义分类法。
食典示例:Display terms in a custom taxonomy
如果列表看起来很平坦,那么您可能只需要一点 CSS 来添加填充列表,因此您可以看到它们的层次结构。
次佳解决方案
我意识到这是一个非常古老的问题,但如果您需要建立一个实际的术语结构,这可能是一个有用的方法:
/**
* Recursively sort an array of taxonomy terms hierarchically. Child categories will be
* placed under a 'children' member of their parent term.
* @param Array $cats taxonomy term objects to sort
* @param Array $into result array to put them in
* @param integer $parentId the current parent ID to put them in
*/
function sort_terms_hierarchicaly(Array &$cats, Array &$into, $parentId = 0)
{
foreach ($cats as $i => $cat) {
if ($cat->parent == $parentId) {
$into[$cat->term_id] = $cat;
unset($cats[$i]);
}
}
foreach ($into as $topCat) {
$topCat->children = array();
sort_terms_hierarchicaly($cats, $topCat->children, $topCat->term_id);
}
}
用法如下:
$categories = get_terms('my_taxonomy_name', array('hide_empty' => false));
$categoryHierarchy = array();
sort_terms_hierarchicaly($categories, $categoryHierarchy);
var_dump($categoryHierarchy);
第三种解决方案
我不知道任何你想要的功能,但你可以建立这样的东西:
<ul>
<?php $hiterms = get_terms("my_tax", array("orderby" => "slug", "parent" => 0)); ?>
<?php foreach($hiterms as $key => $hiterm) : ?>
<li>
<?php echo $hiterm->name; ?>
<?php $loterms = get_terms("my_tax", array("orderby" => "slug", "parent" => $hiterm->term_id)); ?>
<?php if($loterms) : ?>
<ul>
<?php foreach($loterms as $key => $loterm) : ?>
<li><?php echo $loterm->name; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
我没有测试过,但是你可以看到我在做什么。上面的代码将只给你两个级别
编辑:啊是的,你可以使用 wp_list_categories() 做你以后的事情。
第四种方案
您可以使用 wp_list_categories() 与’taxonomy’ 参数。
第五种方案
以下代码将使用术语生成 drop-down,还可以通过编辑 $ outputTemplate 变量生成任何其他元素/结构,并编辑 str_replace 行:
function get_terms_hierarchical($terms, $output = '', $parent_id = 0, $level = 0) {
//Out Template
$outputTemplate = '<option value="%ID%">%PADDING%%NAME%</option>';
foreach ($terms as $term) {
if ($parent_id == $term->parent) {
//Replacing the template variables
$itemOutput = str_replace('%ID%', $term->term_id, $outputTemplate);
$itemOutput = str_replace('%PADDING%', str_pad('', $level*12, ' '), $itemOutput);
$itemOutput = str_replace('%NAME%', $term->name, $itemOutput);
$output .= $itemOutput;
$output = get_terms_hierarchical($terms, $output, $term->term_id, $level + 1);
}
}
return $output;
}
$terms = get_terms('taxonomy', array('hide_empty' => false));
$output = get_terms_hierarchical($terms);
echo '<select>' . $output . '</select>';
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。