Intereting Posts
wpdb get_results () возвращает только 2 строки Изменить все http на https в mysql databse? Добавление «мета-информации» в функцию PHP-сайта PHP? Как отобразить все настраиваемые поля, связанные с типом сообщения – В АДМИНИСТРАЦИИ? Заблокировано / Разблокировано в заголовке Когда модуль тестирует плагин, нужен ли плагин в каталоге wp-content / plugins теста WordPress? Таксономия сливается с существующей страницей Обрезаемая фатальная ошибка: объект класса stdClass не может быть преобразован в строку Штрих-код списка воспроизведения, предотвратить повтор Добавить атрибут в короткий заголовок в поле пользовательского вложения Как исправить .htaccess поврежден Разбиение страницы для плагина списка категорий Как ввести класс для всех элементов option из wp_get_archives ()? Пользовательское значение метабокса не сохраняется Должна ли фотогалерея размещаться в сообщении или на странице?

Показать все сообщения в настраиваемом типе сообщений, сгруппированные по пользовательской таксономии

Я работаю на странице участника, где я использую настраиваемый тип сообщения с пользовательской таксономией. Мой пользовательский тип сообщения называется member и моя пользовательская таксономия называется member_groups .

Я хочу перечислить всех участников, но объединить их в свои группы.

Поэтому, чтобы быть ясным, у меня 35 членов, разделенных на 9 групп, – поэтому вместо того, чтобы делать один и тот же запрос девять раз, я хочу сделать это один раз, но объединить их вместе, чтобы члены Member1, Member4 и Member 11 были сгруппированы в одну группу, «Маркетинг».

Я использую WP_Query для получения всех сообщений в WP_Query типа сообщения. Я пробовал разные попытки, но не добился успеха.

Как я могу это достичь?

Solutions Collecting From Web of "Показать все сообщения в настраиваемом типе сообщений, сгруппированные по пользовательской таксономии"

Таким образом, вы можете рассмотреть возможность автоматизации нескольких запросов.

Во-первых, получите список терминов в вашей пользовательской таксономии, используя get_terms() :

 <?php $member_group_terms = get_terms( 'member_group' ); ?> 

Затем пропустите каждый из них, каждый раз запуская новый запрос:

 <?php foreach ( $member_group_terms as $member_group_term ) { $member_group_query = new WP_Query( array( 'post_type' => 'member', 'tax_query' => array( array( 'taxonomy' => 'member_group', 'field' => 'slug', 'terms' => array( $member_group_term->slug ), 'operator' => 'IN' ) ) ) ); ?> <h2><?php echo $member_group_term->name; ?></h2> <ul> <?php if ( $member_group_query->have_posts() ) : while ( $member_group_query->have_posts() ) : $member_group_query->the_post(); ?> <li><?php echo the_title(); ?></li> <?php endwhile; endif; ?> </ul> <?php // Reset things, for good measure $member_group_query = null; wp_reset_postdata(); } ?> 

Я не вижу ничего подобного в этом вопросе, хотя у него могут быть ограниченные возможности масштабирования (т. Е. Если у вас есть сотни или тысячи членов, или члены member_group, вы можете увидеть проблемы с производительностью).

Я нашел решение, используя пользовательский запрос, а затем сгруппировал его с именем name:

 SELECT * FROM wp_term_taxonomy AS cat_term_taxonomy INNER JOIN wp_terms AS cat_terms ON cat_term_taxonomy.term_id = cat_terms.term_id INNER JOIN wp_term_relationships AS cat_term_relationships ON cat_term_taxonomy.term_taxonomy_id = cat_term_relationships.term_taxonomy_id INNER JOIN wp_posts AS cat_posts ON cat_term_relationships.object_id = cat_posts.ID INNER JOIN wp_postmeta AS meta ON cat_posts.ID = meta.post_id WHERE cat_posts.post_status = 'publish' AND meta.meta_key = 'active' AND meta.meta_value = 'active' AND cat_posts.post_type = 'member' AND cat_term_taxonomy.taxonomy = 'member_groups' 

Затем, просто используя обычный запрос foreach, я могу просто извлечь нужную мне информацию.

Но меня все еще интересует другой способ, если есть, возможно, используя собственные функции WordPress.

еще проще:

 $terms = get_terms('tax_name'); $posts = array(); foreach ( $terms as $term ) { $posts[$term->name] = get_posts(array( 'posts_per_page' => -1, 'post_type' => 'post_type', 'tax_name' => $term->name )); } 

В результирующем массиве $ posts каждый налоговый термин является ключом к вложенному массиву, содержащему его сообщения.

У меня была настоящая необходимость, и решение Чипа работало, за исключением одного: 'field' => 'slug' требуется.

  foreach ( $service_categories as $category ) { $services = new WP_Query( array( 'post_type' => 'service', 'tax_query' => array( array( 'taxonomy' => 'service_category', 'terms' => array( $category->slug ), 'operator' => 'IN', 'get' => 'all', 'field' => 'slug' ) ) ) ); ?> <h2><?php echo $category->slug; ?></h2> <?php if ( $services->have_posts() ) { // loop stuff goes here ?> 

Я также нуждался в том, чтобы отображаемый дисплей был плоским, поэтому здесь устанавливается 'get' => 'all' .

Надеюсь, это поможет кому-то еще.

 $query = new WP_Query( array ( 'post_type' => 'member', 'orderby' => 'meta_value', 'meta_key' => 'member_group' ) ); 

Затем, когда вы просматриваете этот запрос, вы можете просто использовать if, если вдоль этих строк (в псевдокоде php)

 $groupName = ""; $counter = 0; if havePosts: while havePosts: thePost if( $groupName != post->meta_value ) { if ($counter > 0) { </ul> } <h1>A group name</h1> <ul> <li>member name</li> } else { <li>member name</li> } endwhile;endif </ul> 

Надеюсь, это поможет. Думаю, вы делали это намного сложнее, чем нужно.

Дополнительная информация: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

Я должен был сделать это в проекте несколько лет назад. Подобный ответ на djb, просто немного подробнее. Это выведет все ваши имена таксономии как h3, с маркированным списком каждого заголовка, связанного с их страницей подробностей.

 <?php // Output all Taxonomies names with their respective items $terms = get_terms('member_groups'); foreach( $terms as $term ): ?> <h3><?php echo $term->name; // Print the term name ?></h3> <ul> <?php $posts = get_posts(array( 'post_type' => 'member', 'taxonomy' => $term->taxonomy, 'term' => $term->slug, 'nopaging' => true, // to show all posts in this taxonomy, could also use 'numberposts' => -1 instead )); foreach($posts as $post): // begin cycle through posts of this taxonmy setup_postdata($post); //set up post data for use in the loop (enables the_title(), etc without specifying a post ID) ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; ?> </ul> <?php endforeach; ?> 

Ну, это старая нить, но если кто-то пройдет, как и я, это может помочь. Идея состоит в том, чтобы изменить основной запрос, поэтому нам не нужно идти по шаблонам и генерировать новые запросы и циклы …

PS: Тем не менее, нужно тестировать в больших количествах. Это было удовлетворительно в моем случае.

 function grouped_by_taxonomy_main_query( $query ) { if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage $post_ids = array(); $terms = get_terms('my_custom_taxonomy'); foreach ( $terms as $term ) { $post_ids = array_merge( $post_ids, get_posts( array( 'posts_per_page' => 4, // as you wish... 'post_type' => 'my_custom_post_type', // If needed... Default is posts 'fields' => 'ids', // we only want the ids to use later in 'post__in' 'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term ); } $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts $query->query_vars['posts_per_page'] = 16; // If needed... $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order } } // Hook my above function to the pre_get_posts action add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );