Ordonare prin DESC, ASC în WP_Query personalizat

13 aug. 2013, 07:55:26
Vizualizări: 285K
Voturi: 10

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);
2
Comentarii

Ei bine, ar trebui să postezi WP_Query, pentru a vedea dacă este format corect.

Marin Bînzari Marin Bînzari
13 aug. 2013 08:53:28

Iată-l în toată splendoarea sa. În prezent nu ordonez după nimic altceva decât acea valoare meta booleană, deoarece a fost singura modalitate de a face să funcționeze acel nivel de sortare. Site-ul folosește și postări de tip 'headline' care au prioritate față de postările 'featured'. Astfel, le exclud în această interogare

ian ian
13 aug. 2013 09:02:58
Toate răspunsurile la întrebare 4
2
27

Î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;
}
13 aug. 2013 09:14:05
Comentarii

Ca un șef Spartakus. Mulțumesc pentru răspunsul concis și precis. A funcționat perfect

ian ian
13 aug. 2013 10:18:52

Ai putea de asemenea să folosești un array în clauza order by (WP 4.0 și mai nou)

GuilleOjeda GuilleOjeda
25 apr. 2017 16:55:53
1

ORDONEAZĂ DUPĂ ID ASC

$args = array(
    'order' => 'ASC',
    'orderby' => 'ID',
);

sau

ORDONEAZĂ DUPĂ ID DESC

$args = array(
    'order' => 'DESC',
    'orderby' => 'ID',
);
2 feb. 2021 04:58:54
Comentarii

Nu cred că aceasta rezolvă problema originală din întrebare, care era să sortezi după două proprietăți diferite în două direcții diferite.

Rup Rup
2 feb. 2021 11:21:41
1

Î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 pentru orderby. 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.

1 apr. 2025 01:05:52
Comentarii

(Am scris acest răspuns pentru că uit mereu acest lucru, apoi găsesc această postare de pe SO, apoi găsesc anunțul WP.)

dossy dossy
1 apr. 2025 01:06:39
2
-1

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 );     
    
} );
28 dec. 2020 17:17:55
Comentarii

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 Tony Djukic
30 dec. 2020 02:01:14

@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 Iman
7 ian. 2021 18:30:28