PHP WordPress получает многомерный массив объектов категории - PullRequest
3 голосов
/ 29 июля 2011

Я пытаюсь получить все категории на моем WordPress в виде иерархического многомерного массива объектов типа категории. В WordPress есть две функции, которые делают то, что я хочу, но не совсем так:

1) get_categories () - Этот возвращает массив объектов категории, что здорово, но тогда массив является плоским, где нет различий между тем, какая категория является родительской, а какая дочерней.

2) wp_list_categories () - который может возвращать категории с неизменной иерархией, но проблема в том, что возвращаемое значение html, и мне нужно, чтобы категории оставались объектами.

Например, если бы у меня были следующие 3 дерева в качестве моих родительских категорий:

/*
tree_stump

tree1
    branch1

tree2
    branch2
        twig2
            leaves2
            flowers2
            fruits2
*/

Я пытаюсь получить возвращаемое значение, которое может быть примерно таким:

$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  ) ) ) );

, где каждый член массива multi dim по-прежнему является объектом, и во всех дочерних массивах первый является родительским для остальных членов. Полагаю, для этого потребуются какие-то рекурсивные вещи - вещи, которые вызывают у меня дрожь!

Не уверен, что я понял, пожалуйста, дайте мне знать, если мне нужно быть более ясным .. Спасибо за чтение.

Ответы [ 4 ]

4 голосов
/ 21 мая 2014

Вот моя версия, в которой предполагается, что $ 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;
}
2 голосов
/ 14 июня 2012

вот что я сделал: Сначала получите массив, используя get_categories (). Затем преобразуйте его в новый массив. Я предполагаю, что все дети ниже своих родителей в исходном массиве.

$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;
    }
}

Надеюсь, это еще кому-нибудь пригодится

0 голосов
/ 08 июля 2017
<?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);
0 голосов
/ 29 июля 2011

get_categories () возвращает массив с множеством свойств, которые вы можете использовать для построения массива.а именно $category->category_parent и $category->parent

...