Ограничение выпадающего списка таксономии

У меня есть 5 различных пользовательских типов сообщений и одна пользовательская таксономия. Я смог получить <?php wp_dropdown_categories( $args ); ?> таксономии с помощью <?php wp_dropdown_categories( $args ); ?> <?php wp_dropdown_categories( $args ); ?> но я заметил, что я не смог ограничить выпадающий список таксономии, чтобы показать термины, которые содержат сообщения определенного типа сообщений.

Некоторые из комментариев, которые я получил, попросили меня создать другую таксономию для каждого типа сообщений, но это невозможно в моем случае, поскольку моя пользовательская таксономия предназначена для определения местоположения, и я бы хотел, чтобы все 5 пользовательских типов сообщений использовали этот систематики.

Я знаю, что я могу загружать сообщения из типа сообщения и получать термины с этих сообщений и использовать цикл foreach для их циклирования и выводить их как параметры в поле выбора, но я не хочу использовать это, так как я потерял бы иерархию, которую я создал для таксономии. Если я смогу получить иерархию с помощью этого метода, тогда я тоже открыт для этого.

Возможно ли это или я должен создать отдельные таксономии для каждого типа сообщений?

UPDATE Я хотел бы добавить значение настраиваемого поля также в качестве параметра. Ответ TheDeadMedic делает это.

Solutions Collecting From Web of "Ограничение выпадающего списка таксономии"

Вы можете использовать фрагмент, который я нашел для запроса терминов, прикрепленных к определенному типу сообщения:

 function wpse_207655_terms_by_post_type_or_meta( $clauses, $taxonomy, $args ) { $meta_query = new WP_Meta_Query; $meta_query->parse_query_vars( $args ); $post_types = ''; if ( ! empty( $args['post_type'] ) ) { if ( $_post_types = array_intersect( ( array ) $args['post_type'], get_post_types() ) ) $post_types = implode( "','", $_post_types ); } if ( $post_types || $meta_query->queries ) { global $wpdb; $clauses['join'] .= " INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id"; $clauses['orderby'] = "GROUP BY t.term_id {$clauses['orderby']}"; if ( $post_types ) $clauses['where'] .= " AND p.post_type IN ('$post_types')"; if ( $meta_query->queries ) { $sql = $meta_query->get_sql( 'post', 'p', 'ID' ); $clauses['join'] .= $sql['join']; $clauses['where'] .= $sql['where']; } } return $clauses; } add_filter( 'terms_clauses', 'wpse_207655_terms_by_post_type_or_meta', 10, 3 ); 

Теперь вы можете использовать аргумент post_type в wp_dropdown_categories (который фактически просто передается на get_terms , где наш фильтр входит в игру):

 wp_dropdown_categories( 'taxonomy=location&post_type=X' ); 

Обновление: теперь вы также можете использовать мета-аргументы WP_Query :

 wp_dropdown_categories( 'meta_key=foobar' ); 

… или метаданные с полным текстом:

 wp_dropdown_categories( array( 'post_type' => 'foobar', 'meta_query' => array( array( 'key' => 'this', 'value' => 'that', ), array( 'key' => 'foobar', ), ), ));