Ich muss (benutzerdefinierte) Beiträge nach 2 benutzerdefinierten Feldwerten sortieren ...
Benutzerdefinierter Feldname 1: is_sponsored
[Wert kann entweder sein 1
oder 0
]
Benutzerdefinierter Feldname 2: sfp_date
[auch timestamp
bekannt als aktuelles Post-Datum in Sekunden]
Beiträge, deren is_sponsored
Wert " " 1 ist, müssen oben stehen und in der Endreihenfolge nach " sfp_date
" sortiert DESC
sein. 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.
quelle
Antworten:
OK, die letzte Problemumgehung wäre, die Abfrage zu teilen:
... und verwenden Sie den Filter "posts_orderby", um den ORDER-Teil zu ändern:
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:
... und auf der Seite mit unserem Filter zum Verwerfen von Abfragen:
Hoffentlich macht es Sinn!
quelle
Ich schreibe Ihre Anfrage leicht modifizierend. Ich hoffe es kann helfen.
Bitte lassen Sie mich wissen, ob es funktioniert oder nicht :-)
quelle