meta_query sortiert nach 2 Schlüsseln

Ich muss (benutzerdefinierte) Beiträge nach 2 benutzerdefinierten Feldwerten sortieren …

benutzerdefinierter Feldname 1: is_sponsored [Wert kann entweder 1 oder 0 ]

benutzerdefinierter Feldname 2: sfp_date [ timestamp aka aktuelles sfp_date in Sekunden]

Beiträge, deren Wert ” is_sponsored ” 1 ist, müssen oben stehen, sortiert nach ” sfp_date ” in der DESC sfp_date . Alle anderen Posts, deren Wert ” is_sponsored ” 0 ist, sollten unten aufgeführt sein – in absteigender Reihenfolge (mit ” sfp_date “).

Ich habe etwas wie:

 $sfp_query_args = array( 'tax_query' => array( array( 'taxonomy' => 'sfp_posts', 'terms' => array( 1, 5, 8 ) ) ), 'post_type' => 'sfpposts', 'post_status' => 'publish', 'showposts' => 15, 'paged' => $paged, 'meta_key' => 'sfp_date', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'meta_query' => array( 'key' => 'is_sponsored', 'value' => 2, 'type' => 'NUMERIC', 'compare' => '<=' ) ); $wp_q = new WP_Query( $sfp_query_args ); 

… aber nicht funktioniert. Irgendwelche Ideen?


Anmerkung des Redakteurs: Dies ist ein kleines Plugin, das zeigen sollte, wie die Abfrage aussieht, da wir wahrscheinlich keinen Datensatz zum Testen haben.

 <?php /** Plugin Name: (#67600) Dump Query parts */ function wpse67600_dump_query_parts( $pieces ) { echo '
'.var_export( $pieces, true ).'

'; return $pieces; } add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );

BITTE FEHLEN SIE OUTPUT VON PLUGIN HIER HINZU – benutzen Sie den Link “Bearbeiten” .

EDIT von Dameer

OK, nachdem ich die Anfrage und zahlreiche Workarounds verfolgt habe, habe ich mir folgendes ausgedacht …

Wenn ich “$ sfp_query_args” ein wenig vereinfache, liegt das Ergebnis nahe bei dem, was benötigt wird, jedoch bleibt die Unfähigkeit, Posts zu sortieren, so wie es ist. Hier ist es:

 $sfp_query_args1 = array( 'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ), 'post_type' => 'sfpposts', 'post_status' => 'publish', 'showposts' => (int)$per_page, 'paged' => $paged, 'meta_key' => 'is_sponsored', 'orderby' => 'meta_value date' ); 
  • * orderby übernimmt zwei Attribute: meta_value und date *

So sieht $ wpdb-> request mit obigen Argumenten in der Abfrage so aus:

 SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'sfpposts' AND ($wpdb->posts.post_status = 'publish') AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC LIMIT 0, $per_page 

Und schließlich, um nach meta_value sortieren zu können, sollte die Abfrage mit nur einem kleinen Unterschied gesetzt werden:

 SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE 1=1 AND $wpdb->posts.post_type = 'sfpposts' AND ($wpdb->posts.post_status = 'publish') AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) GROUP BY $wpdb->posts.ID ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC LIMIT 0, $per_page 

Bitte markieren Sie [! ORDER MISSING!] Platzhalter. Ich denke, das obige sollte erklären, wo genau das Problem auftritt.

Solutions Collecting From Web of "meta_query sortiert nach 2 Schlüsseln"

OK, die letzte Problemumgehung wäre das Teilen der Abfrage:

 $sfp_query_args = array( 'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ), 'meta_key' => 'is_sponsored', 'post_type' => 'sfpposts', 'post_status' => 'publish', 'showposts' => (int)$per_page, 'paged' => $paged ); 

… und benutze den “posts_orderby” -Filter, um den ORDER-Teil zu ändern:

 add_filter( 'posts_orderby', 'sfp_modify_orderby' ); function sfp_modify_orderby( $orderby ) { if( !is_admin() && is_tax( 'sfp_post_category' ) ) { global $wpdb; $orderby = " $wpdb->postmeta.meta_value DESC, $wpdb->posts.post_date DESC "; } return $orderby; } 

Wahrscheinlich müssen Sie den Filter nach der Schleife auf der Seite entfernen, um zu verhindern, dass sich ‘posts_orderby’ auf eine andere Abfrage (Seitenleiste oder Fußzeile) auswirkt. Also hier ist eine andere function in “functions.php”:

 function sfp_remove_orderby_filter() { remove_filter( 'posts_orderby', 'sfp_modify_orderby' ); } 

… und auf der Seite mit unserem Abfrageverwerfungsfilter:

 if( have_posts() ) : while( have_posts() ) : the_post(); // code endwhile; else : // code endif; sfp_remove_orderby_filter(); 

Hoffentlich macht es Sinn!

Ich schreibe Ihre Anfrage leicht modifizieren. Ich hoffe, es kann helfen.

 $sfp_query_args = array( 'tax_query' => array( array( 'taxonomy' => 'sfp_posts', 'terms' => array( 1, 5, 8) ) ), 'post_type' => 'sfpposts', 'post_status' => 'publish', 'showposts' => 15, 'paged' => $paged, 'meta_key'=>'sfp_date', 'meta_query' => array( array( 'key' => 'sfp_date', 'type' => 'NUMERIC', ), array( 'key' => 'is_sponsored', 'value' => '2', 'compare' => '< =' ) ), 'orderby' => 'meta_value_num', 'order' => 'DESC', ); $wp_q = new WP_Query( $sfp_query_args ); 

Bitte lassen Sie mich wissen, ob es funktioniert oder nicht 🙂