Intereting Posts
Существуют ли процедуры предотвращения вредоносных обновлений плагинов? Как повторно использовать шаблоны php в качестве коротких кодов? Как добавить страницы для подачи? Какие хорошие плагины для начинающих? Можем ли мы создать shorcode для перемещения следующей страницы? Использование памяти для масштабируемых запросов usermeta Показывать несколько категорий в запросе с использованием переменной frame как сделать запуск cronjob, когда пользователь должен войти в систему Почему в моей функции нет настроек cookie? Auto 301 to full post Постоянная ссылка? (используя: / archive /% post_id% to% post_name%) WP_Query не возвращает результатов Фильтр поиска с пользовательской таксономией и настраиваемыми полями: как мне обрабатывать его с помощью плагина? Как отображать все продукты, включая цены в woocommerce, используя sql Отображать сообщения, подкатегории и категории пользовательских типов сообщений и таксономии Как удалить «Гордо работает на WordPress» в 20-й (2016) теме?

Объедините две таксономии в иерархическом дереве

Например, у меня есть продукты WooCommerce, которые имеют таксономии:

  • бренд (например, Converse, adidas, D & G) (таксономия id: product_brand)
  • (например, сапоги, кроссовки, сандалии, каблуки) (таксономия id: product_cat)

Конечно, не каждый бренд включает все категории.

Мне нужно перечислить категории по брендам. (что-то похожее на то, что делает Zappos . Например:

Converse - Sandals (2) - Sneakers (6) D&G - Boots (10) - Heels (4) - Sandals (7) 

Есть ли какой-либо легкий способ сделать это, за исключением того, что вы перебираете все продукты с определенным брендом и проверяете его категорию?

Solutions Collecting From Web of "Объедините две таксономии в иерархическом дереве"

Чтобы получить список всех терминов таксономии X, чьи должности также связаны с терминами из таксономии Y, мы должны:

  1. Получить все идентификаторы термина для обеих таксономий
  2. Создайте налоговый запрос для получения всех сообщений, потому что мы не хотим показывать архивы с пустыми терминами.
  3. Отформатируйте результат в иерархическом списке.

Поехали!

  1. Получение идентификаторов термина просто:

     get_terms( $taxonomy_name, array( 'fields' => 'ids' ) ) 

    Мы просто должны сделать это два раза (для каждой таксономии один раз).

  2. Запрос таксономии требует отношений AND чтобы убедиться, что все сообщения, которые мы получаем, находятся в обеих таксономии:

      'tax_query' => array ( 'relation' => 'AND', array( 'taxonomy' => $first, 'field' => 'id', 'terms' => get_terms( $first, array( 'fields' => 'ids' ) ) ), array( 'taxonomy' => $second, 'field' => 'id', 'terms' => get_terms( $second, array( 'fields' => 'ids' ) ) ), ), 
  3. Для форматирования мы создаем массив, в котором термины первой таксономии являются ключами, а значениями второй таксономии являются значения. Затем мы создаем вложенный список с обычными элементами <ul> .

Теперь функция: я использовал теги и категории как таксономии, просто потому, что было легче протестировать.

 function double_term_tree( $post_types = array( 'post', 'page' ), $first = 'category', $second = 'post_tag' ) { $query = new WP_Query( array ( 'numberposts' => -1, 'suppress_filters' => TRUE, 'posts_per_page' => -1, 'post_type' => $post_types, 'tax_query' => array ( 'relation' => 'AND', array( 'taxonomy' => $first, 'field' => 'id', 'terms' => get_terms( $first, array( 'fields' => 'ids' ) ) ), array( 'taxonomy' => $second, 'field' => 'id', 'terms' => get_terms( $second, array( 'fields' => 'ids' ) ) ), ), ) ); if ( empty ( $query->posts ) ) return; $result_list = array(); $output = '<ul>'; foreach ( $query->posts as $post ) { $first_terms = get_the_term_list( $post->ID, $first, '', '|' ); $second_terms = get_the_term_list( $post->ID, $second, '', '|' ); $f_term_array = explode( '|', $first_terms ); $s_term_array = explode( '|', $second_terms ); foreach ( $f_term_array as $f_term ) { if ( ! isset ( $result_list[ $f_term ] ) ) $result_list[ $f_term ] = array(); $result_list[ $f_term ] = array_merge( $result_list[ $f_term ], $s_term_array ); } } foreach ( $result_list as $k => $v ) { $result_list[ $k ] = array_unique( $v ); $output .= "\n<li>$k\n\t<ul>\n\t\t<li>" . join( "</li>\n\t\t<li>", array_unique( $v ) ) . "</li>\n\t</ul>\n</li>"; } $output .= '</ul>'; return $output; } 

Вы можете вызвать эту функцию следующим образом:

 echo double_term_tree( 'product', 'brand', 'category' ); 

И тогда вы получите это дерево.