Wie kann man mit meta_query_posts abfragen, um nach meta_key zu bestellen UND eine sekundäre Sortierung nach Datum vorzunehmen?


8

Ich habe in den letzten Tagen ein Problem behoben und bin im Kreis weitergegangen. Könnte wirklich ein neues Paar Augen gebrauchen, um mir bei der Beantwortung dieser Frage zu helfen ...

Ich arbeite also mit einer WordPress-Site, auf der Posts einige benutzerdefinierte Felder haben, die für die Abfrage relevant sind, die ich ausführen muss: "Post-Expired" und "My-Sort-Order". Wenn ich meine query_posts ausführe, möchte ich, dass die Ergebnisse Posts sind, bei denen "post-expired" NICHT "yes" ist (dieser Teil funktioniert in meinem Code). Ich möchte auch, dass die Ergebnisse nach dem DESC-Nummernwert von "Meine Sortierreihenfolge" sortiert werden (funktioniert auch) UND wenn es einen Zusammenhang mit "Meine Sortierreihenfolge" gibt, möchte ich eine sekundäre Sortierung nach Datum mit den neuesten Beiträgen zuerst.

Bei der sekundären Sortierung nach Datum habe ich Probleme.

Hier ist der Code, den ich gerade habe:

<?php               
$args = array(
    'paged' => $paged,
    'meta_query'=> array(
        array(
            'key'=>'post-expired',
            'value'=> 'yes',
            'compare' => '!='
        )
    ),
    'meta_key'=>'my-sort-order',
    'orderby'=>'meta_value_num', 
    'order'=>'DESC'
);

$args = array_merge( $args , $wp_query->query );

query_posts( $args );
?>

Mit dem obigen Code erhalte ich die nicht abgelaufenen Beiträge korrekt zurück und sie sind nach absteigender Reihenfolge sortiert (dh 100 werden vor 99 angezeigt usw.). Aber wenn beide Posts den gleichen Wert für die Sortierreihenfolge haben, passiert eine Art sekundäre Sortierung, die ich scheinbar nicht kontrollieren kann (und nicht herausfinden kann, worauf sie tatsächlich sortiert wird).

Meine erste Idee, dies zu lösen, bestand darin, "meine Sortierreihenfolge" nur dann um Werte zu erweitern, wenn ich eine bestimmte Sortierreihenfolge für diesen Beitrag festlegen wollte. Ich dachte, wenn der Wert für dieses Feld für den Rest der Beiträge leer gelassen würde, würden sie einfach in der Standardsortierung nach DESC-Datum zurückgegeben (nach den Beiträgen mit einer festgelegten Sortierreihenfolge). Was jedoch tatsächlich geschah, waren Beiträge, für die kein Wert für die Sortierreihenfolge festgelegt wurde ...

Als Nächstes habe ich versucht, mehrere Werte in das Feld orderby wie folgt hinzuzufügen:

('orderby'=>'meta_value_num date')

Das hat beide Sortierreihenfolgen, die ich anstrebte, völlig in die Luft gesprengt und die Posts auf unerwartete Weise zurückgegeben. Ich hatte den Eindruck, dass mehrere orderby-Werte zulässig waren, aber aus irgendeinem Grund funktioniert es hier nicht.

Zum jetzigen Zeitpunkt bin ich mir nicht sicher, wie eine dieser potenziellen Lösungen funktionieren soll. Weiß jemand, wie ich entweder 1) Beiträge zuerst nach dem Feld "Meine Sortierreihenfolge" sortieren und dann die verbleibenden Beiträge ohne Wert in diesem Feld mit der Standarddatumsortierung zurückgeben kann; oder 2) Finden Sie heraus, wie Sie die sekundäre Reihenfolge nach Sortierung steuern können, damit alle Posts, die mit "Meine Sortierreihenfolge" verknüpft sind, nach Datum sortiert werden (neueste zuerst).

Antworten:


2

Hoffentlich haben Sie dies inzwischen herausgefunden, aber wenn Sie dies nicht getan haben, sollten Sie den Filter "posts_orderby" verwenden können, um eine bestimmte Reihenfolge für Ihre Abfrage einzuwählen. Ich werde hier keine vollständige Lösung geben, aber Sie können auf diesen Beitrag für weitere Informationen verweisen: http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

BEARBEITEN:

Hier ist die Dokumentation - im Grunde können Sie einfach die ORDER BY-Klausel der SQL überschreiben: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

Und hier ist der Beispielcode aus den Dokumenten:

add_filter('posts_orderby', 'edit_posts_orderby');
add_filter('posts_join_paged','edit_posts_join_paged');

function edit_posts_join_paged($join_paged_statement) {
$join_paged_statement = "LEFT JOIN wp_gdsr_data_article gdsra ON gdsra.post_id = wp_posts.ID";
return $join_paged_statement;   
}

function edit_posts_orderby($orderby_statement) {
$orderby_statement = "(gdsra.user_votes_total_sum/gdsra.user_votes_count) DESC";
return $orderby_statement;
}

Ja, der posts_orderby-Filter ist genau das, wonach Sie suchen. Ich werde die Antwort mit dem Code auf diesem Link bearbeiten ...
mltsy
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.