我在同事阿夫扎尔先生的帮助下,用简单的PHP解决了这个问题。我现有的查询是:
$all_terms = get_categories( array(
\'taxonomy\' => \'my_tax\',
\'show_count\' => true,
\'hide_empty\' => false,
\'orderby\' => \'term_group\', //bogus :p
) );
我将其改为
$wpdb
查询以获得更好的控件:
global $wpdb;
$tax_query = $wpdb->get_results("SELECT t.*, tt.* FROM $wpdb->terms AS t
INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id
WHERE tt.taxonomy IN (\'my_tax\')
ORDER BY tt.parent, t.name ASC
", ARRAY_A);
因此,我们现在有了按字母顺序排序的数组,其中包含一些有价值的信息,我需要这些信息来进行进一步的讨论:
层次结构数组
我使用
this SO thread, 这是一个递归函数:
function create_tax_tree( &$list, $parent ) {
$taxTree = array();
foreach( $parent as $ind => $val ) {
if( isset($list[$val[\'term_id\']]) ) {
$val[\'children\'] = create_tax_tree( $list, $list[$val[\'term_id\']] );
}
$taxTree[] = $val;
}
return $taxTree;
}
这个函数将使我成为一个具有精确父子关系的数组。在db查询之后,我现在执行了以下操作:
if (count( $tax_query ) > 0) :
//Making my tree array
$taxs = array();
foreach( $tax_query as $tax ) {
$taxs[ $tax[\'parent\'] ][] = $tax;
}
//that\'s my tree in array or arrays
$tax_tree = create_tax_tree( $taxs, $taxs[0] );
else :
_e(\'No term found\', \'textdomain\');
endif;
现在我的树在
$tax_tree
变量如果我
var_dump($tax_tree)
, 这是一个数组数组,充满了精确的父子关系。
最终结果
要获得最终结果,我们需要另一个递归函数,这里PHP5提供了
nice bunch of classes, 从中学习
this SO thread. 我以以下方式使用其中两个:
$tax_iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator( $tax_tree ));
foreach( $tax_iterator as $key => $value ) {
$depth = get_tax_depth( $term_id, true ); //custom-made function
if( \'term_id\' === $key )
$term_id = (int) $value; //having the term_id for further use
if( \'name\' === $key ) {
echo \'<p>\';
$pad = str_repeat(\'---\', $depth * 3); //for visual hierarchy
echo $pad .\' \'. $value; //the name of the tax term
echo \'</p>\';
}
}
输出为:
Level 0
-- Level 1
--- Level 2
---- Level 3
--- Level 2
---- Level 3
---- Level 3
-- Level 1
--- Level 2
:)