2011-07-28 7 views
3

私のwordpress上のすべてのカテゴリを、カテゴリcategoryのオブジェクトの階層型多次元配列として取得しようとしています。 WordPressには2つの機能がありますが、正確にはそうではありません。PHP wordpressはカテゴリオブジェクトの多次元配列を取得します

1)get_categories() - カテゴリオブジェクトの配列を返しますが、これは素晴らしいですが配列はフラットです1つは、どのカテゴリが親であるか、どちらが子であるかの区別がない場合です。

2)wp_list_categories() - herarchyをそのまま使用してカテゴリを返すことができますが、戻り値がhtmlであることが問題です。カテゴリがオブジェクトである必要があります。私は私の親レスカテゴリとして、以下の3本の木を持っている場合たとえば

は、:

$cat_tree=array(1=>$tree_stump,2=>array(1=>$tree1,2=>$branch1),3=>array(1=>$tree2,2=>array(1=>$branch2,2=>array($twig2,$leaves2,$flowers2,$fruits2 )))); 

/* 
tree_stump 

tree1 
    branch1 

tree2 
    branch2 
     twig2 
      leaves2 
      flowers2 
      fruits2 
*/ 

私のようなものになる可能性があり、戻り値を取得しようとしていますマルチ・ディメンション・アレイの各メンバーは依然としてオブジェクトであり、すべての子配列では、最初のメンバーは残りのメンバーの親です。私は、これはいくつかちょっと再帰的なものが必要になると思う - 私に不安を与えるもの!

私が理にかなっているかどうかわかりませんが、私がより明確にする必要がある場合はお知らせください。 読んでいただきありがとうございます。

答えて

0

get_categories()は、配列の構築に使用できるたくさんのプロパティを持つ配列を返します。つまり$category->category_parent$category->parent

+0

デビッドに感謝しますが、特に再帰的なビットを使用して、もう少し助けてもらいたいと思います。 – SIndhu

2

これは私がやったことです: まずget_categories()を使って配列を取得します。その後、新しい配列に変換します。 私はすべての子供が元の配列の親の下にいると仮定しています。これはまだ誰か

ここ
+0

カテゴリネストが2レベル以上深い場合、この方法は失敗します。親[ID:1]>子[ID:2]>孫[ID:3]という構造を想定します。 $ cats_tree [1] = WP_Term-> children [2] = WP_Termを生成し、$ cats_tree [3] = WP_Termを生成します。 (擬似コードに申し訳ありません) – Arron

+0

第3レベルは、トップレベルに兄弟として現れます。再帰的なpatrick64の回答はうまくいきますが、 – Arron

4

するのに便利です

$cats_tree = array(); 
foreach($categories as $category){ 
    $parent = $category->parent; 
    if ($parent && isset($cats_tree[$parent])){ 
     $cats_tree[$parent]->children[$category->cat_ID] = $category; 
    }else{    
     $cats_tree[$category->cat_ID] = $category; 
    } 
} 

希望は、彼らが来るどのような順序get_categories()の出力があるが、それは問題ではない$カテゴリを前提として私のバージョンです。

$cats_tree = get_cat_tree(0,$categories); 
function get_cat_tree($parent,$categories) { 
    $result = array(); 
    foreach($categories as $category){ 
     if ($parent == $category->category_parent) { 
      $category->children = get_cat_tree($category->cat_ID,$categories); 
      $result[] = $category; 
     } 
    } 
    return $result; 
} 
+1

私はこれが再帰を使用するのが大好きです。うまくやった – Arron

0
<?php 
$args = array(
    'taxonomy' => 'category', 
    'orderby' => 'name', 
    'order' => 'ASC', 
    'hierarchical' => true, 
    'hide_empty' => false, 
); 
$the_query = new WP_Term_Query($args); 
$categories = $the_query->get_terms();  

function get_cat_tree($parent,$categories) { 
    $result = array(); 
    foreach($categories as $category){ 
     if ($parent == $category->parent) { 
      $category->children = get_cat_tree($category->term_id,$categories); 
      $result[] = $category; 
     } 
    } 
    return $result; 
} 
$cats_tree = get_cat_tree(0,$categories);