Intereting Posts
Установить переходный процесс с ошибкой получения сообщений Фильтрация метаданных WP_Query по числовым значениям не работает Какая хорошая альтернатива использованию $ content_width для оптимизации изображений? Конвертировать WordPress.com вставлять ссылки на обычные вложения Выбор не более 12 заказов во всех выбранных параметрах Перенос в плагин WordPress Recipe и некоторые проблемы SQL GoDaddy хостинг wp-admin проблема В чем разница между term_id и term_taxonomy_id Отображение недавних выдержек на статической главной странице Сортировка сообщения по пользовательскому полевому числовому значению показать все в query_posts на category.php? Измените текст справки «Введите название здесь» в настраиваемом типе сообщения Добавить дополнительное поле в окно меню навигации? Как ссылаться на страницу параметров тем из любого места в админ? Как термины связаны с сообщениями в базе данных?

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

Скажем, я использую 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 "Сортировка по иерархическому значению двухуровневой таксономии, даже если второй уровень не установлен"