Intereting Posts
Loop не исключает указанную категорию на главной странице Пусть частные сообщения остаются в статусе «частные» после редактирования через «редакторы», Как убедиться, что содержимое не отображается, если выбор пуст Панировочные сундуки с родительскими и дочерними страницами Есть ли способ восстановить постоянную ссылку страницы без плагина? Описание тега не показывает гиперссылку Образец URL-адреса WordPress перенаправляется на главную страницу В чем разница между опциями и настройками? Как я могу избежать повторного создания колеса Custom Fields в Metabox моего плагина? Перенаправление на текущую страницу после входа в систему Как добавить кнопки пользовательского интерфейса в настройке, например, двадцать одиннадцать Как имя WordPress изменяет размер копий изображений? Жесткий код домена в Yoast SEO канонические URL-адреса Удалить разделы Custuomize Как логин возможен, если я запрещаю страницу входа через .htaccess с разрешением ip

Сортировка по иерархическому значению двухуровневой таксономии, даже если второй уровень не установлен

Скажем, я использую pieces с назначенными таксономиями places , а places – иерархические, для «страны» и «региона».

Чтобы правильно отсортировать pieces — по «стране», затем по «региону» — я подключил свою функцию к фильтру posts_clauses , например:

 if( ! function_exists('orderby_tax_clauses') ) { function orderby_tax_clauses( $clauses, $wp_query ) { global $wpdb; $taxonomies = get_taxonomies( ); foreach ($taxonomies as $taxonomy) { if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) { if ( $taxonomy == 'places' ) { $clauses['join'] .=<<<SQL -- first level, "country": JOIN {$wpdb->term_relationships} tr_l1 ON ({$wpdb->posts}.ID = tr_l1.object_id) JOIN {$wpdb->term_taxonomy} tt_l1 ON (tr_l1.term_taxonomy_id = tt_l1.term_taxonomy_id AND tt_l1.taxonomy = 'places' AND tt_l1.parent = 0) JOIN {$wpdb->terms} t_l1 ON (tt_l1.term_id = t_l1.term_id) -- second level, "region": JOIN {$wpdb->term_relationships} tr_l2 ON ({$wpdb->posts}.ID = tr_l2.object_id) JOIN {$wpdb->term_taxonomy} tt_l2 ON (tr_l2.term_taxonomy_id = tt_l2.term_taxonomy_id AND tt_l2.taxonomy = 'places' AND tt_l2.parent = tt_l1.term_taxonomy_id) JOIN {$wpdb->terms} t_l2 ON (tt_l2.term_id = t_l2.term_id) SQL; $clauses['fields'] .= ", t_l1.name AS place1"; $clauses['fields'] .= ", t_l2.name AS place2"; $clauses['orderby'] = "place1 ASC, place2 ASC"; } } } return $clauses; } } add_filter( 'posts_clauses', 'orderby_tax_clauses', 10, 2 ); 

Это отлично работает, если моя piece имеет два уровня назначенных places : «страна» и «регион»; но теперь это не всегда так, для некоторых pieces я могу по какой-то причине присвоить «страну», но не «регион».

И эти pieces просто теряются в таких запросах.

Думаю, мне нужно OUTER для JOIN s.

Но когда я запускаю LEFT OUTER JOIN вместо JOIN для второго уровня, я получаю неправильную сортировку второго уровня даже для тех places которых оба уровня назначены.

Поэтому, пожалуйста, что я делаю неправильно и как я должен построить свой запрос.

Solutions Collecting From Web of "Сортировка по иерархическому значению двухуровневой таксономии, даже если второй уровень не установлен"