Перебирать все теги и выходные сообщения в алфавитном списке

У меня есть куча сообщений, каждая из которых имеет несколько тегов, и я пытаюсь найти способ вывода всех из них на одной странице, организованной в алфавитном списке их соответствующих тегов. Например, если Post1 имеет теги A, B и D, а Post2 имеет теги A, C и D, результат будет выглядеть так:

Тег A
Post1
Post2

Тег B
Сообщение 1

Тег C
Post2

Тег D
Post1
Post2

EDIT: Я начал работать с категориями, но мне все равно нравится работать с тегами. (Все исключенные идентификаторы – это то, что я технически использую категории для другой организации.) Функциональный код:

<?php $cat_args = array( 'orderby' => 'title', 'order' => 'ASC', 'exclude' => '26,27,32,52,36,31,42,38,41' ); $categories = get_categories($cat_args); foreach ($categories as $category) { $catID = $category->term_id; $catName = $category->name; echo '<strong>'.$catName.'</strong>'; global $post; // required $pArgs = array('category' => $catID,'post_type' => 'shows','orderby' => 'title', 'order' => 'ASC'); $custom_posts = get_posts($pArgs); foreach($custom_posts as $post) : setup_postdata($post); ?> <div class="show"> <a href="<?php the_permalink(); ?>"> <?php the_post_thumbnail("show"); ?> <h3 class="center"><?php the_title(); ?></h3> </a> </div> <?php endforeach; ?> <?php } ?> 

(Untested), но должен работать с любой таксономией, включая таксономию «tag» ( post_tag ). В следующем примере используется таксономия с именем «моя таксономия».

 <?php //Get terms for this taxonomy - orders by name ASC by default $terms = get_terms('my-taxonomy'); //Loop through each term foreach($terms as $term): //Query posts by term. $args = array( 'orderby' => 'title', //As requested in comments 'tax_query' => array( array( 'taxonomy' => 'my-taxonomy', 'field' => 'slug', 'terms' => array($term->slug) ) )); $tag_query = new WP_Query( $args ); //Does tag have posts? if($tag_query->have_posts()): //Display tag title echo '<h2> Tag :'.esc_html($term->name).'</h2>'; //Loop through posts and display while($tag_query->have_posts()):$tag_query->the_post(); //Display post info here endwhile; endif; //End if $tag_query->have_posts wp_reset_postdata(); endforeach;//Endforeach $term ?> в <?php //Get terms for this taxonomy - orders by name ASC by default $terms = get_terms('my-taxonomy'); //Loop through each term foreach($terms as $term): //Query posts by term. $args = array( 'orderby' => 'title', //As requested in comments 'tax_query' => array( array( 'taxonomy' => 'my-taxonomy', 'field' => 'slug', 'terms' => array($term->slug) ) )); $tag_query = new WP_Query( $args ); //Does tag have posts? if($tag_query->have_posts()): //Display tag title echo '<h2> Tag :'.esc_html($term->name).'</h2>'; //Loop through posts and display while($tag_query->have_posts()):$tag_query->the_post(); //Display post info here endwhile; endif; //End if $tag_query->have_posts wp_reset_postdata(); endforeach;//Endforeach $term ?> 

Вот последний код, который я использовал с пользовательской таксономией (отредактированный на основе ответа Стивена выше, так что он действительно работает – я все еще просто запрашивал категории с моим старым кодом):

 <?php $terms = get_terms('dates'); foreach($terms as $term): $args = array( 'orderby' => 'title', 'tax_query' => array( array( 'taxonomy' => 'dates', 'field' => 'slug', 'terms' => array($term->slug) ) ) ); $tag_query = new WP_Query( $args ); if($tag_query->have_posts()): echo '<strong>'.esc_html($term->name).'</strong>'; while($tag_query->have_posts()):$tag_query->the_post(); ?> <div class="show"> <a href="<?php the_permalink(); ?>"> <?php the_post_thumbnail("show"); ?> <h3 class="center"><?php the_title(); ?></h3> </a> </div><!-- .show --> <?php endwhile; endif; //End if $tag_query->have_posts wp_reset_postdata(); endforeach; //Endforeach $term ?> в <?php $terms = get_terms('dates'); foreach($terms as $term): $args = array( 'orderby' => 'title', 'tax_query' => array( array( 'taxonomy' => 'dates', 'field' => 'slug', 'terms' => array($term->slug) ) ) ); $tag_query = new WP_Query( $args ); if($tag_query->have_posts()): echo '<strong>'.esc_html($term->name).'</strong>'; while($tag_query->have_posts()):$tag_query->the_post(); ?> <div class="show"> <a href="<?php the_permalink(); ?>"> <?php the_post_thumbnail("show"); ?> <h3 class="center"><?php the_title(); ?></h3> </a> </div><!-- .show --> <?php endwhile; endif; //End if $tag_query->have_posts wp_reset_postdata(); endforeach; //Endforeach $term ?> 
  $tags = get_tags(); foreach($tags as $tag) { echo '<strong>'.$tag->name.'</strong>'; $args=array( 'tag__in' => array($tag->term_id), 'showposts'=>5, 'caller_get_posts'=>1 ); $my_query = new WP_Query($args); if( $my_query->have_posts() ) { while ($my_query->have_posts()) : $my_query->the_post(); ......... endwhile; } } 

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

 <?php $tags = get_tags(); $tag_str = array(); foreach($tags as $tag) { $tag_str[] = $tag->name; } if(!empty($tag_str)){ $tag_str = implode('+', $tag_str); $my_query = new WP_Query(array('orderby' => 'title', 'order' => 'ASC', $tag => $tag_str)); if($my_query->have_posts()): while($my_query->have_posts()):$my_query->the_post(); //loop here endwhile; endif; wp_reset_postdata(); } else { //do something if no tags found } ?> в <?php $tags = get_tags(); $tag_str = array(); foreach($tags as $tag) { $tag_str[] = $tag->name; } if(!empty($tag_str)){ $tag_str = implode('+', $tag_str); $my_query = new WP_Query(array('orderby' => 'title', 'order' => 'ASC', $tag => $tag_str)); if($my_query->have_posts()): while($my_query->have_posts()):$my_query->the_post(); //loop here endwhile; endif; wp_reset_postdata(); } else { //do something if no tags found } ?> 

Не пробовал этот код, но должен дать вам представление. Поставьте дополнительные проверки там, где это необходимо.