Ordonare prin DESC, ASC în WP_Query personalizat
Am nevoie să fac o ordonare multi-nivel într-o interogare. Problema este legată de ordonarea unei valori DESC și a celeilalte ASC, ca în SQL. Următorul cod SQL pare să îmi dea ceea ce doresc atunci când îl execut în terminal:
SELECT DISTINCT * FROM wp_posts
INNER JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = 'post'
AND wp_postmeta.meta_key = 'pb_issue_featured'
AND wp_posts.post_status = 'publish'
ORDER BY wp_postmeta.meta_value DESC, wp_posts.menu_order ASC;
Câmpul pb_issue_featured este o valoare booleană. Rezultatul final de care am nevoie este ca interogarea să afișeze articolele care au o valoare meta de 1 pentru acest câmp în partea de sus, apoi toate celelalte dedesubt. Al doilea nivel de ordonare este menu_order desemnat (folosesc plugin-ul post types order).
Problema este că valoarea mea booleană trebuie să fie ordonată de sus în jos (1 la 0), dar menu_order este invers. Ceea ce este ordonat primul cu plugin-ul are un menu_order de 1. Deci, utilizarea parametrului integrat 'orderby' în WP_Query nu funcționează. Are cineva sugestii? Am analizat filtrul 'posts_orderby' dar nu am reușit să-l aplic. Nu eram sigur unde ar trebui aplicat sau cum aș putea să îl depanez. Pur și simplu nu a reordonat în modul în care l-am configurat.
Mulțumesc pentru ajutor! Voi posta WP_Query-ul real dacă este relevant, dar am vrut să mențin acest post cât mai scurt posibil.
Argumentele interogării:
$args = array(
'post_type' => 'post',
'meta_key' => 'pb_issue_featured',
'orderby' => 'meta_value',
'order' => 'DESC',
'post_status' => 'publish',
'posts_per_page' => $posts,
'paged' => $paged,
'meta_query' => array(
array(
'key' => 'headline',
'value' => 1,
'compare' => '!='
)
)
);
$q = new WP_Query($args);
Încearcă acest cod:
$args = array(
'post_type' => 'post',
'meta_key' => 'pb_issue_featured',
'orderby' => 'meta_value',
'order' => 'DESC',
'posts_per_page' => $posts,
'paged' => $paged,
'paged' => 1,
'meta_query' => array(
array(
'key' => 'headline',
'value' => 1,
'compare' => '!='
)
)
);
add_filter( 'posts_orderby', 'filter_query' );
$q = new WP_Query($args);
remove_filter( 'posts_orderby', 'filter_query' );
function filter_query( $query ) {
$query .= ', wp_posts.menu_order ASC';
return $query;
}
Începând cu WordPress 4.0, mulțumită schimbării 29027 din 08.07.2014, este posibilă transmiterea unui array pentru orderby, conform articolului Un ORDER BY mai puternic în WordPress 4.0.
În versiunea 4.0, acum puteți transmite un array către
WP_Queryca valoare pentruorderby. Sintaxa arată astfel:$q = new WP_Query( array( 'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' ) ) );Acest lucru vă permite să controlați generarea clauzei
ORDER BYcu mai multă precizie:ORDER BY post_title DESC, menu_order ASCÎnainte de versiunea 4.0, ar fi trebuit să folosiți filtre complicate pe instrucțiunea SQL sau pe o clauză specifică. Nu era deloc bine.
atunci când utilizezi un plugin precum Elementor și ai un câmp personalizat cu numele date, adaugă următoarea acțiune în elementor-pro/elementor-pro.php în editorul de plugin-uri.
add_action( 'elementor/query/my_custom_filter', function( $query ) {
$query->set( 'meta_key', 'date' );
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'DESC' );
$query->set( 'posts_per_page', 2 );
} );
Ce legătură are Elementor aici? Literalmente nu există nicio mențiune despre Elementor în întrebarea inițială sau în răspunsurile ori comentariile ulterioare.
Tony Djukic
@TonyDjukic, ai dreptate în ceea ce privește irelevanța Elementor. Dar pentru că Google mi-a arătat această pagină după ce am căutat eroarea mea specifică despre personalizarea WP_Query și mi-a luat ceva timp să găsesc soluția, am crezut că ar putea ajuta pe altcineva cu aceeași problemă.
Iman