meta_query Sortierung nach 2 Schlüsseln

8

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

Benutzerdefinierter Feldname 1: is_sponsored[Wert kann entweder sein 1oder 0]

Benutzerdefinierter Feldname 2: sfp_date[auch timestampbekannt als aktuelles Post-Datum in Sekunden]

Beiträge, deren is_sponsoredWert " " 1 ist, müssen oben stehen und in der Endreihenfolge nach " sfp_date" sortiert DESCsein. Alle anderen Beiträge, deren " is_sponsored" Wert 0 ist, sollten unten aufgeführt werden - ebenfalls in absteigender Reihenfolge (nach " sfp_date").

Ich habe so 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 der Redaktion: Dies ist ein kleines Plugin, das zeigen soll, wie die Abfrage aussieht, da wahrscheinlich kein Datensatz verfügbar ist, um dies zu testen.

<?php
/** Plugin Name: (#67600) Dump Query parts */
function wpse67600_dump_query_parts( $pieces )
{
    echo '<pre>'.var_export( $pieces, true ).'</pre>';
    return $pieces;
}
add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );

OP BITTE HIER AUSGABE VON PLUGIN HINZUFÜGEN - Verwenden Sie den Link "Bearbeiten" .

EDIT von Dameer

OK, nach Verfolgung der Anfrage und zahlreichen Problemumgehungen habe ich Folgendes gefunden ...

Wenn ich "$ sfp_query_args" ein wenig vereinfache, liegt das Ergebnis nahe an dem, was erforderlich ist. Die Unfähigkeit, Beiträge zu sortieren, bleibt jedoch unverändert. 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 nimmt zwei Attribute an: meta_value und date *

$ Wpdb-> request mit den obigen Argumenten in der Abfrage sieht also folgendermaßen 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 sollte die Abfrage mit nur einem kleinen Unterschied festgelegt werden, um auch nach meta_value sortieren zu können:

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 finden Sie den Platzhalter [! ORDER MISSING!]. Ich denke, das Obige sollte erklären, wo genau das Problem auftritt.

Dameer
quelle
Ich glaube nicht, dass Sie das mit der Standardklasse WP_Query tun können . Sogar in den Dokumenten steht "Wissen Sie, wie man die Abfrage sortiert, wenn der meta_value ein Array ist? Schreiben Sie es hier". Sie müssen wahrscheinlich Ihre eigene SQL-Abfrage dafür schreiben.
Miha Rekar
Ja, ich weiß, dass es noch nicht gelöst wurde, aber ich dachte, dies ist der richtige Ort, um es zu klären :)
Dameer
Ich habe Ihrer Frage ein kleines Plugin hinzugefügt, damit Sie uns die endgültigen SQL-Abfrageteile anzeigen können. Bitte bearbeiten Sie Ihre Frage mit diesen Informationen. Vielen Dank.
Kaiser
Oh, und hier sind einige Informationen aus einer verwandten Frage, wie das Sortieren im Allgemeinen funktioniert.
Kaiser

Antworten:

2

OK, die letzte Problemumgehung wäre, die Abfrage zu teilen:

$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 verwenden Sie den Filter "posts_orderby", 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;
}

Höchstwahrscheinlich müssen Sie den Filter nach der Schleife auf der Seite entfernen, um zu verhindern, dass 'posts_orderby' andere Abfragen (Seitenleiste oder Fußzeile) beeinflusst. Hier ist eine weitere Funktion, die Sie in "functions.php" einfügen können:

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

... und auf der Seite mit unserem Filter zum Verwerfen von Abfragen:

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

sfp_remove_orderby_filter();

Hoffentlich macht es Sinn!

Dameer
quelle
-1

Ich schreibe Ihre Anfrage leicht modifizierend. 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 :-)

Md Toufiqul Islam
quelle
2
Dies würde standardmäßig nach Datum sortieren, da Sie nicht 'meta_key' angeben.
Miha Rekar
Vielen Dank @MihaRekar, Es war ein Fehler, danke für Ihre Korrektur
Md Toufiqul Islam
Ich fürchte, es funktioniert nicht, es sortiert die Beiträge einfach weiter nach Datum, ohne diejenigen mit dem Wert "is_sponsored" von 1 nach oben zu setzen.
Dameer
Ich suche nach einer Lösung dafür. Vielleicht ist @MihaRekar richtig. Möglicherweise müssen Sie eine benutzerdefinierte SQL-Abfrage für diese schreiben
Md Toufiqul Islam
Gibt es eine Möglichkeit, ein Beispiel für eine "normale" mySQL-Abfrage bereitzustellen?
Dameer