Holen Sie Post-Meta in der gleichen Abfrage wie die Hauptschleife

Ich habe einen benutzerdefinierten Beitragstyp “Personal” und jeder als ein benutzerdefiniertes Feld “_staff_purpose” (beschreibt seine function).

Ich möchte, dass die Vorlage archive-staff.php alle Mitarbeiter, sortiert nach ihrem _Staff_Purpose, anzeigt, so dass ich dann das Ergebnis mit dem _staff_purpose als Überschrift durchlaufen kann. Das Ergebnis, das ich gerne hätte, ist wie folgt:

ID | post_title | _staff_purpose ----------------------------------------- 1 | Tracy Chap. | administrator ----------------------------------------- 2 | John Doe. | teacher ----------------------------------------- 3 | Robert Smith | teacher ----------------------------------------- 

Das rohe SQL sollte dies sein:

 SELECT * FROM `bj_posts` p LEFT JOIN ( SELECT post_id, meta_value as purpose FROM `bj_postmeta` pm WHERE `meta_key`='purpose' ) pm ON p.ID=pm.post_id WHERE p.`post_type`='staff' AND p.`post_status`='publish' ORDER BY purpose ASC, post_title ASC 

Ich habe es versucht:

 add_action( 'pre_get_posts', 'fetch_staff_people' ); function fetch_staff_people( $query ) { if ( is_page_template('archive-staff.php') && $query->is_main_query() ) { $query->set( 'post_per_page', '-1' ); $query->set( 'meta_key', '_staff_purpose' ); $query->set('orderby', 'meta_value title'); // sort by purpose, then by staff name. $query->set( 'order', 'ASC ASC' ); } else { return; } return $query; } 

Die Abfrage scheint zu funktionieren, aber der benutzerdefinierte Feldwert wird nicht in der Schleife angezeigt.

Solutions Collecting From Web of "Holen Sie Post-Meta in der gleichen Abfrage wie die Hauptschleife"

Sie können die Doppelsortieroption nicht verwenden. Sie können diesen Code einmal ausprobieren:

 add_action( 'pre_get_posts', 'fetch_staff_people' ); function fetch_staff_people( $query ) { if ( is_post_type_archive('staff') && $query->is_main_query() ) { $query->set( 'post_per_page', '-1' ); $query->set( 'meta_key', '_staff_purpose' ); $query->set('orderby', 'meta_value_num'); // sort by purpose, then by staff name. $query->set( 'order', 'ASC' ); } } 

Hinweis: Ich habe die function is_post_type_archive() im bedingten Tag verwendet. Es überprüft die Archivseite. Siehe den Codex