Sortieren Sie eine benutzerdefinierte Post-Typ-Schleife durch eine benutzerdefinierte Taxomomie statt chronologisch

Ich möchte einfach die Bücher (einen benutzerdefinierten Beitragstyp) auflisten, die nach ihrem jeweiligen Genre organisiert sind (die Taxonomie, die mit dem unten stehenden Code erstellt wurde). Ich habe den gesamten verwendeten Code unten aufgeführt.

Ich verwende den folgenden Code in einer Seitenvorlage, um den benutzerdefinierten Posttyp ‘Buch’ aufzurufen:

 'book', 'posts_per_page' => '40', 'orderby' => 'id', 'order' => 'ASC', 'paged'=> $paged ); query_posts($myposts); ?> 

Dies ist der Ursprung des benutzerdefinierten Post-Typs in der Datei functions.php:

 add_action( 'init', 'register_cpt_book' ); function register_cpt_book() { $labels = array( 'name' => _x( 'Books', 'book' ), 'singular_name' => _x( 'Book', 'book' ), 'add_new' => _x( 'Add New', 'book' ), 'add_new_item' => _x( 'Add New Book', 'book' ), 'edit_item' => _x( 'Edit Book', 'book' ), 'new_item' => _x( 'New Book', 'book' ), 'view_item' => _x( 'View Book', 'book' ), 'search_items' => _x( 'Search Books', 'book' ), 'not_found' => _x( 'No books found', 'book' ), 'not_found_in_trash' => _x( 'No books found in Trash', 'book' ), 'parent_item_colon' => _x( 'Parent Book:', 'book' ), 'menu_name' => _x( 'Books', 'book' ), ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'description' => 'A collection of books', 'supports' => array( 'title', 'editor', 'excerpt', 'author', 'custom-fields' ), 'taxonomies' => array( 'author', 'genre' ), 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'show_in_nav_menus' => true, 'publicly_queryable' => true, 'exclude_from_search' => false, 'has_archive' => true, 'query_var' => true, 'can_export' => true, 'rewrite' => true, 'capability_type' => 'post' ); register_post_type( 'book', $args ); } 

Hier ist die benutzerdefinierte Taxonomie ‘genres’ in functions.php:

 // Add new taxonomy, make it hierarchical (like categories) $labels = array( 'name' => _x( 'Genres', 'genre' ), 'singular_name' => _x( 'Genre', 'genre' ), 'search_items' => __( 'Search Genres' ), 'all_items' => __( 'All Genres' ), 'parent_item' => __( 'Parent Genre' ), 'parent_item_colon' => __( 'Parent Genre:' ), 'edit_item' => __( 'Edit Genre' ), 'update_item' => __( 'Update Genre' ), 'add_new_item' => __( 'Add New Genre' ), 'new_item_name' => __( 'New Genre Name' ), 'menu_name' => __( 'Genre' ), ); $args = array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'genre' ), ); register_taxonomy( 'genre', array( 'book' ), $args ); 

Der Code funktioniert großartig. Wie ich schon sagte, ich möchte nur die Bücher auflisten, die nach ihrem jeweiligen Genre organisiert sind (die Taxonomie, die oben gemacht wurde).

Die Buchschleife würde dann ungefähr so ​​aussehen:

Philosophie

Philosophie Buch 1, Philosophie Buch 2, Philosophie Buch 3

Psychologie

Psychologie-Buch 1, Psychologie-Buch 2, Psychologie-Buch 3

Geschichte

Geschichtsbuch 1, Geschichtsbuch 2, Geschichtsbuch 3

Ich habe verschiedene Methoden ausprobiert, die ich beim googlen gefunden habe, aber ich konnte nichts finden, was funktioniert. Ich wäre sehr dankbar, wenn mir jemand eine brauchbare Antwort geben könnte. Vielen Dank.

Solutions Collecting From Web of "Sortieren Sie eine benutzerdefinierte Post-Typ-Schleife durch eine benutzerdefinierte Taxomomie statt chronologisch"

Es stellt sich also heraus, dass ich überhaupt keine Schleife gemacht habe. Das ist jetzt einige Jahre alt. Ich weiß nicht einmal, wie ich dazu gekommen bin, weil Klauseln / Grenzen und DB-Sachen immer noch ein bisschen über meinem Kopf sind. Wie auch immer, ich hoffe, es hilft einigen … Ich dachte mir sicher, ich hätte eine Schleife von Schleifen, aber das sollte auch nicht so schwer zu schreiben sein.

 //remove limits from article CPT archive function kia_archive_limits( $limits ) { if( ! is_admin() && ( is_post_type_archive( 'article' ) ) ) { // remove limits $limits = ''; } return $limits; } add_filter('post_limits', 'kia_archive_limits' ); //complicated queries for articles depending on query var function kia_article_clauses( $clauses, $wp_query ) { global $wpdb; if( is_post_type_archive( 'article' )) { //join term_relationships to posts, and term_relationships to term_taxonomy and term_taxonomy to terms $clauses['join'] .= "LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id) LEFT OUTER JOIN {$wpdb->terms} USING (term_id)" ; //group posts by term name $clauses['groupby'] = "object_id"; //include posts with and without a subject term $clauses['where'] .= " AND (taxonomy = 'subject' OR taxonomy IS NULL)"; $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) "; } return $clauses; } add_filter( 'posts_clauses', 'kia_article_clauses', 10, 2 ); 

Und mein Loop-Code sah ungefähr so ​​aus:

 
< ?php $prev = ''; $counter = 1; $column = 1; while ( have_posts() ) : the_post(); $subhead = array_shift(wp_get_post_terms(get_the_ID(), 'subject', array("fields" => "names"))); $subhead = $subhead ? $subhead : __('No Subject','peterwade'); if($counter >= 20) { //reset the counter $counter = 1; $column++; //what column are we on? if($column == 5 ){ $column = 1; //reset column count $hr = '
'; } else { $hr = false; } if ($column == 4) { $class = "column last"; } else { $class = "column"; } ?>
< ?php if($hr) echo $hr;?>

< ?php printf('%s %s', $subhead, __('continued'));?>

< ?php } if($subhead != $prev) { $counter++; ?>

< ?php echo $subhead;?>

< ?php } $prev = $subhead; $counter++; endwhile; ?>

Wenn ich nun auf die Quelle auf der Seite schaue, auf die ich Sie verlinkt habe, scheint es, dass er wieder zu dem geworden ist, wie er früher Dinge getan hat …. aka … ein riesiger Tisch. Ob das daran lag, dass mein Code nicht mehr funktionierte, konnte ich nicht sagen.

Alternative

Dies wäre eine Schleife von Schleifen. Die Bedingungen durchblättern und dann die Beiträge in jedem Semester abfragen. Sie müssten einen Benchmark erstellen, um festzustellen, welche Methode schneller ist. Ich würde sehr empfehlen, die Anfragen in irgendeiner Art von Transient zu speichern, aber es ist Zeit für das Abendessen!

 $terms = get_terms( 'genre' ); if( $terms ): foreach( $terms as $term ){ // The Query $args = array( 'post_type' => 'book', 'nopaging' => true, 'tax_query' => array( array( 'taxonomy' => 'genre', 'field' => 'id', 'terms' => $term->term_id ) ) ); $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { echo '

' . ucwords( $term->name ) . '

'; echo '
    '; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '
  • ' . get_the_title() . '
  • '; } echo '
'; } } endif; /* Restore original Post Data */ wp_reset_postdata();