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.


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!


-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 :-)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.