Bestellung eines bestimmten Post-Typs

Ich versuche herauszufinden, wie ich meine Posts in einem benutzerdefinierten Feld bestellen kann. Ich verwende einen Kalender (den Veranstaltungskalender) mit einem benutzerdefinierten Feld namens “Künstler”. Es funktioniert, obwohl meine Suchanfrage auch alle anderen Post-Typen betrifft, was dazu führt, dass mein Menü und meine Nachrichten verschwinden. Hier ist der Code, den ich gerade habe:

function order_calendar_by_artist( $query ){ $query->set( 'meta_key', 'artist' ); $query->set( 'orderby', 'meta_value' ); return $query; } add_filter( 'pre_get_posts', 'order_calendar_by_artist', 99 ); 

Wenn ich auch post_type setze, bekomme ich auch einen 404 Fehler auf meiner Homepage:

 function order_calendar_by_artist( $query ){ $query->set( 'post_type', 'tribe_events' ); $query->set( 'meta_key', 'artist' ); $query->set( 'orderby', 'meta_value' ); return $query; } add_filter( 'pre_get_posts', 'order_calendar_by_artist', 99 ); 

Solutions Collecting From Web of "Bestellung eines bestimmten Post-Typs"

Aktualisieren

Ich habe die Lösung gefunden, indem ich zuerst mit is_main_query() und dann die bedingte statement is_post_type_archive( 'tribe_events' ) , wie es in der ersten Antwort vorgeschlagen wurde.

 function order_calendar_by_artist( $query ){ if ( is_admin() || !$query->is_main_query() ) { return; } if( is_post_type_archive( 'tribe_events' ) ){ $query->set( 'meta_key', 'artist' ); $query->set( 'orderby', 'meta_value' ); } } add_filter( 'pre_get_posts', 'order_calendar_by_artist', 99 ); 

Alte Antwort 2

Probieren Sie Folgendes (im Plugin-Forum):

 function order_calendar_by_artist( $query ) { if ( !empty( $query->tribe_is_multi_posttype ) ) { $query->set( 'meta_key', 'artist' ); $query->set( 'orderby', 'meta_value' ); } } add_action( 'pre_get_posts', 'order_calendar_by_artist' ); 

Es scheint, dass Sie die korrekte $query für das Kalender-Plugin finden müssen. Sie könnten immer print_r( $query); um zu sehen, welche Abfragen auf dieser Seite ausgeführt werden, und die Bedingung entsprechend anzupassen. Könnte eine Weile dauern, aber es ist alles, was ich im Mo denken kann.


Alte Antwort 1

Sie könnten den functionscode wie folgt in eine bedingte statement einfügen:

 function order_calendar_by_artist( $query ) { if ( is_post_type_archive( 'tribe_events' ) ) { $query->set( 'meta_key', 'artist' ); $query->set( 'orderby', 'meta_value' ); } return $query; } add_filter( 'pre_get_posts', 'order_calendar_by_artist', 99 ); 

Was dies tun sollte, ist nur die Abfrage auf der tribe_events Post-Typ anzupassen. Die Bedingung muss möglicherweise angepasst werden, abhängig davon, wo die Abfrage wirksam werden soll. Im Moment verwenden Sie die Aktion pre_get_posts die sich auf jede einzelne Abfrage auf der Site auswirkt, so dass Sie sich auf einen bestimmten Bereich konzentrieren müssen, in dem Ihre function ausgeführt werden soll (dh mit einer Bedingung).

Sie können auch Folgendes verwenden, um Auswirkungen auf die Admin-Seite zu vermeiden

 if ( is_post_type_archive( 'tribe_events' ) && !is_admin() ) { ... } 

Ich habe das nicht wirklich getestet, aber es sollte funktionieren … (sagt er)

Andernfalls müssen Sie möglicherweise die WP_Query() -function verwenden und eine neue Abfrage erstellen, wo immer Sie Ihre Posts neu ordnen müssen.

 $args = array( 'post_type' => 'tribe_events', 'orderby' => 'meta_value_num', 'order' => 'ASC', //or DESC 'meta_key' => 'artist' ); $query = new WP_Query( $args ); if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); //Loop stuff endwhile; endif; wp_reset_postdata();