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_Query
ca 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 BY
cu 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.

@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ă.
