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

<p>я работаю над страницей участника, где я использую пользовательский тип сообщения с пользовательской таксономией. мой пользовательский тип записи называется <code>member</code>, а моя пользовательская таксономия называется <code>member\_groups</code>.</p><p>я хочу перечислить всех участников, но сгруппировать их в соответствующие группы.</p><p>чтобы было ясно, у меня 35 членов, разделенных на 9 групп - поэтому вместо того, чтобы делать один и тот же запрос девять раз, я хочу сделать это один раз, но сгруппировать их так, чтобы member1, member4 и member 11 были сгруппированы в одну группу, называется "маркетинг".</p><p>я использую <code>wp\_query</code>, чтобы получить все сообщения с типом сообщения. я пробовал разные попытки, но безуспешно.</p><p>как я могу этого достичь?</p>

<p>я нашел решение, используя пользовательский запрос и затем сгруппировав его с именем термина:</p><pre><code>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' </code></pre><p>затем, используя обычный запрос foreach, я могу просто извлечь нужную информацию.</p><p>но я все еще интересуюсь другим способом, если есть, возможно, с использованием собственных функций wordpress.</p>

<p>итак, вы можете рассмотреть возможность автоматизации нескольких запросов.</p><p>сначала получите список терминов в вашей пользовательской таксономии, используя <a href="http://codex.wordpress.org/function\_reference/get\_terms"><code>get\_terms()</code></a> :</p><pre><code><?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' ) ) ) ); ?> <?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(); ?> <?php echo the_title(); ?> <?php endwhile; endif; ?>  <?php // reset things, for good measure $member\_group\_query = null; wp\_reset\_postdata(); } ?> </code></pre><p>я не вижу ничего особенно<em> неправильно </em>с этим подходом, хотя у него может быть ограниченная возможность масштабирования (то есть, если у вас есть сотни или тысячи членов или члены member\_group, вы можете увидеть проблемы с производительностью).</p>

<p>еще проще:</p><pre><code>$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 каждый налоговый термин является ключом для вложенного массива, содержащего его записи.</p>

<p>у меня была именно эта необходимость, и <a href="https://wordpress.stackexchange.com/a/40117/5566">решение чипа</a> работало, за исключением одного: требуется <code>'field' => 'slug'</code>.</p><pre><code> 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; ?> <?php if ( $services->have\_posts() ) { // loop stuff goes here ?> </code></pre><p>мне также нужно, чтобы полученное изображение было плоским, поэтому здесь устанавливается <code>'get' => 'all'</code>.</p><p>надеюсь, это поможет кому-то еще.</p>

<p>я должен был сделать это на проекте несколько лет назад. подобный ответ на djb, только с более подробной информацией. это выведет все ваши имена таксономии в виде h3 с маркированным списком каждого заголовка сообщения, связанного с их страницей сведений.</p><pre><code><?php // output all taxonomies names with their respective items $terms = get_terms('member_groups'); foreach( $terms as $term ): ?> <?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; ?> </code></pre>

<pre><code>$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) {  } a group name  member name } else { member name } endwhile;endif  надеюсь, это поможет. я думаю, вы делали это намного сложнее, чем нужно.дополнительная информация: <a href="http://codex.wordpress.org/class_reference/wp_query#taxonomy_parameters">http://codex.wordpress.org/class_reference/wp_query#taxonomy_parameters 

ну, это старая ветка, но если кто-то пройдет мимо, как я, это может помочь. идея состоит в том, чтобы изменить основной запрос, чтобы нам не нужно было идти по шаблонам и генерировать новые запросы и циклы ...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' ); </code></pre>