WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

Правильное дерево терминов

Возникает проблема при выводе таксономий записи в древовидном порядке. Дело в том, что функции:

$cur_terms = wp_get_post_terms( $post->ID, 'Systematic', array('orderby'=>'parent'));

или

$cur_terms = get_the_terms( $post->ID, 'Systematic');
$cur_terms = wp_list_sort( $cur_terms, 'parent' );

Возвращают массив отсортированный по значению поля parent. Но у меня id указанные в данном поле создавались не по порядку, соответственно список приходитт не от родителя к ребенку.
Пример результата вызова:

Array (
	[0] => WP_Term Object ( [term_id] => 1054 [name] => Отдел: Ascomycota (Аскомицеты) [slug] => ascomycota [term_group] => 0 [term_taxonomy_id] => 1070 [taxonomy] => Systematic [description] => [parent] => 0 [count] => 31 [filter] => raw ) 
	[1] => WP_Term Object ( [term_id] => 1199 [name] => Подотдел: Pezizomycotina (Пезизомикотины) [slug] => pezizomycotina [term_group] => 0 [term_taxonomy_id] => 1215 [taxonomy] => Systematic [description] => [parent] => 1054 [count] => 19 [filter] => raw ) 
	[2] => WP_Term Object ( [term_id] => 1268 [name] => Подкласс: Pezizomycetidae (Пецицомицеты) [slug] => pezizomycetidae [term_group] => 0 [term_taxonomy_id] => 1284 [taxonomy] => Systematic [description] => [parent] => 1055 [count] => 11 [filter] => raw ) 
	[3] => WP_Term Object ( [term_id] => 1057 [name] => Семейство: Discinaceae (Дисциновые) [slug] => discinaceae [term_group] => 0 [term_taxonomy_id] => 1073 [taxonomy] => Systematic [description] => [parent] => 1056 [count] => 3 [filter] => raw ) 
	[4] => WP_Term Object ( [term_id] => 1058 [name] => Род: Gyromitra (Строчок) [slug] => gyromitra [term_group] => 0 [term_taxonomy_id] => 1074 [taxonomy] => Systematic [description] => [parent] => 1057 [count] => 3 [filter] => raw ) 
	[5] => WP_Term Object ( [term_id] => 1055 [name] => Класс: Pezizomycetes (Пецицомицеты) [slug] => pezizomycetes [term_group] => 0 [term_taxonomy_id] => 1071 [taxonomy] => Systematic [description] => [parent] => 1199 [count] => 24 [filter] => raw ) 
	[6] => WP_Term Object ( [term_id] => 1056 [name] => Порядок: Pezizales (Пецицевые) [slug] => pezizales [term_group] => 0 [term_taxonomy_id] => 1072 [taxonomy] => Systematic [description] => [parent] => 1268 [count] => 24 [filter] => raw ) 
);

Как отсортировать результат, чтобы он шел в правильном порядке?

0
2 месяца назад
  • 0
    Glomberg139 cайт: viktor-web.ru

    На ум пришла рекурсия

    $sorted_terms = array(); //промежуточный массив
    
    function  cur_terms_sorting( $cur_terms, $current_parent = 0 ) {    
    
    	global $sorted_terms;
    
    	foreach ( $cur_terms as $term ) {
    		if( $term->parent == $current_parent ) {
    
    			$sorted_terms[] = $term;
    			$current_parent = $term->term_id;
    
    		}
    	}
    
    	if( count( $sorted_terms ) < count( $cur_terms ) ) {
    		cur_terms_sorting( $cur_terms, $current_parent );
    	}
    
    	return $sorted_terms;
    
    }
    
    $cur_terms_sorted = cur_terms_sorting( $cur_terms ); // тут необходимый вам порядок терминов
    Leon1010 2 месяца назад

    Спасибо, работает, но на некоторых страницах, выдает ошибку:
    Fatal error: Maximum function nesting level of '100' reached, aborting!
    Как это исправить?

    Glomberg 2 месяца назад

    А что, у вас есть более ста вложенных друг в друга терминов? Если ошибка возникает на страницах, где не нужна эта рекурсивная сортировка - необходимо добавить условие и выполнять сортировку только там, где необходимо.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация