私は「地理的位置」と呼ばれる階層的分類法を持っています。それは最初のレベルの大陸、そしてそれぞれの国を含んでいます。例:
Europe
- Ireland
- Spain
- Sweden
Asia
- Laos
- Thailand
- Vietnam
等.
Get_terms()を使用して、用語の完全なリストを出力することができましたが、大陸は国と混同され、1つの大きなフラットリストになりました。
上記のような階層リストを出力するにはどうすればいいですか?
分類法の引数と共にwp_list_categories
を使用してください。これは階層的なカテゴリーリストを作成するために作られていますが、カスタム分類法の使用もサポートします。
コーデックスの例:
カスタム分類法で用語を表示する
リストが平坦に戻ってくる場合は、リストにパディングを追加するための小さな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>
私はこれをテストしていませんが、あなたは私が何を得ているのか見ることができます。上記のコードがすることはあなたに2つのレベルだけを与えることです
編集:ああはいあなたはあなたの後に何をするためにwp_list_categories()を使用することができます。
'taxonomy'引数を付けて、wp_list_categories()を使用することができます。
次のコードでは、単語付きのドロップダウンを生成しますが、$ 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>';
私は同じものを探していたが1つの記事の条件を得るために、ついに私はこれをまとめました、そしてそれは私のために働きます。
それは何をしますか:
•特定の投稿の分類名のすべての用語を取得します。
•2つのレベルを持つ階層的分類法(例:レベル1: '国'とレベル2: '都市')では、レベル1とそれに続くレベル2のulリストを持つh4を作成します。
•分類法が階層的でない場合は、全項目のulリストのみが作成されます。ここにコードがあります(私は自分のためにそれを書いているので、私はできる限り一般的になろうとしましたが...):
function finishingLister($heTerm){
$myterm = $heTerm;
$terms = get_the_terms($post->ID,$myterm);
if($terms){
$count = count($terms);
echo '<h3>'.$myterm;
echo ((($count>1)&&(!endswith($myterm, 's')))?'s':"").'</h3>';
echo '<div class="'.$myterm.'Wrapper">';
foreach ($terms as $term) {
if (0 == $term->parent) $parentsItems[] = $term;
if ($term->parent) $childItems[] = $term;
};
if(is_taxonomy_hierarchical( $heTerm )){
foreach ($parentsItems as $parentsItem){
echo '<h4>'.$parentsItem->name.'</h4>';
echo '<ul>';
foreach($childItems as $childItem){
if ($childItem->parent == $parentsItem->term_id){
echo '<li>'.$childItem->name.'</li>';
};
};
echo '</ul>';
};
}else{
echo '<ul>';
foreach($parentsItems as $parentsItem){
echo '<li>'.$parentsItem->name.'</li>';
};
echo '</ul>';
};
echo '</div>';
};
};
それで最後に、あなたはこれで関数を呼び出します(明らかに、あなたはあなたのものでmy_taxonomyを置き換えます):finishingLister('my_taxonomy');
私はそれが完璧だとは思わないが、私が言ったようにそれは私のために働く。
私はこの問題を抱えていました、そして、ここでの答えのどれも私にはうまくいきませんでした。
これが私の最新の作業バージョンです。
function locationSelector( $fieldName ) {
$args = array('hide_empty' => false, 'hierarchical' => true, 'parent' => 0);
$terms = get_terms("locations", $args);
$html = '';
$html .= '<select name="' . $fieldName . '"' . 'class="chosen-select ' . $fieldName . '"' . '>';
foreach ( $terms as $term ) {
$html .= '<option value="' . $term->term_id . '">' . $term->name . '</option>';
$args = array(
'hide_empty' => false,
'hierarchical' => true,
'parent' => $term->term_id
);
$childterms = get_terms("locations", $args);
foreach ( $childterms as $childterm ) {
$html .= '<option value="' . $childterm->term_id . '">' . $term->name . ' > ' . $childterm->name . '</option>';
$args = array('hide_empty' => false, 'hierarchical' => true, 'parent' => $childterm->term_id);
$granchildterms = get_terms("locations", $args);
foreach ( $granchildterms as $granchild ) {
$html .= '<option value="' . $granchild->term_id . '">' . $term->name . ' > ' . $childterm->name . ' > ' . $granchild->name . '</option>';
}
}
}
$html .= "</select>";
return $html;
}
そして使用法:
$selector = locationSelector('locationSelectClass');
echo $selector;
私は本当にうまくいっている@popsiコードを使いました、そして、私はそれをもっと効率的で読みやすくしました:
/**
* 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 integer $parentId the current parent ID to put them in
*/
function sort_terms_hierarchicaly(Array $cats, $parentId = 0)
{
$into = [];
foreach ($cats as $i => $cat) {
if ($cat->parent == $parentId) {
$cat->children = sort_terms_hierarchicaly($cats, $cat->term_id);
$into[$cat->term_id] = $cat;
}
}
return $into;
}
使用法 :
$sorted_terms = sort_terms_hierarchicaly($terms);