Ordinare per DESC, ASC in WP_Query personalizzata

13 ago 2013, 07:55:26
Visualizzazioni: 285K
Voti: 10

Ho bisogno di fare un ordinamento multilivello in una query. Il problema è con l'ordinamento di un valore in DESC e l'altro in ASC come in SQL. La seguente query SQL sembra darmi ciò che voglio quando la eseguo nel terminale:

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;

Il campo pb_issue_featured è un valore booleano. Il risultato finale di cui ho bisogno è che la query mostri i post che hanno un valore meta di 1 per questo campo in cima, e poi tutti gli altri sotto. Il secondo livello di ordinamento è il menu_order designato (sto usando il plugin post types order).

Il problema è che il mio valore booleano deve essere ordinato dall'alto verso il basso (da 1 a 0) ma il menu_order è l'opposto. Ciò che viene ordinato per primo con il plugin ha un menu_order di 1. Quindi usare il parametro 'orderby' integrato in WP_Query non funziona. Qualcuno ha suggerimenti? Ho esaminato il filtro 'posts_orderby' ma non sono riuscito a farlo funzionare. Non ero sicuro di dove dovesse essere applicato o come potrei risolvere il problema. Semplicemente non ha riordinato nel modo in cui l'avevo impostato.

Grazie per l'aiuto! Posterò la WP_Query effettiva se è rilevante, ma volevo mantenere questo post il più breve possibile.

Gli argomenti della query:

$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
Commenti

Beh, dovresti postare la WP_Query, per vedere se è formata correttamente.

Marin Bînzari Marin Bînzari
13 ago 2013 08:53:28

Eccola in tutta la sua gloria. Attualmente non sto ordinando per nessun parametro eccetto quel valore meta booleano, perché era l'unico modo per far funzionare quel livello di ordinamento. Il sito utilizza anche i post 'headline' che hanno la precedenza sui post 'featured'. Quindi li escludo in questa query

ian ian
13 ago 2013 09:02:58
Tutte le risposte alla domanda 4
2
27

Prova questo:

$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' => '!=' // confronto diverso da 1
                )
            )
        );

// Aggiungi un filtro all'ordinamento delle query
add_filter( 'posts_orderby', 'filter_query' );
$q = new WP_Query($args);
// Rimuovi il filtro dopo l'esecuzione della query
remove_filter( 'posts_orderby', 'filter_query' );

// Funzione per modificare l'ordinamento
function filter_query( $query ) {
    $query .= ', wp_posts.menu_order ASC';
    return $query;
}
13 ago 2013 09:14:05
Commenti

Come un boss Spartakus. Grazie per la risposta concisa e accurata. Ha funzionato perfettamente

ian ian
13 ago 2013 10:18:52

Potresti anche utilizzare un array nella clausola order by (WP 4.0 e versioni successive)

GuilleOjeda GuilleOjeda
25 apr 2017 16:55:53
1

ORDER BY ID ASC

$args = array(
    'order' => 'ASC', // Ordine ascendente
    'orderby' => 'ID', // Ordinamento per ID
);

o

ORDER BY ID DESC

$args = array(
    'order' => 'DESC', // Ordine discendente
    'orderby' => 'ID', // Ordinamento per ID
);
2 feb 2021 04:58:54
Commenti

Non credo che questo risolva il problema originale nella domanda, che era di ordinare per due proprietà diverse in due direzioni diverse.

Rup Rup
2 feb 2021 11:21:41
1

A partire da WordPress 4.0 grazie al changeset 29027 del 08-07-2014, è possibile passare un array per orderby, secondo Un ORDER BY più potente in WordPress 4.0.

In 4.0, puoi ora passare un array a WP_Query come valore per orderby. La sintassi appare così:

$q = new WP_Query( array( 'orderby' => array( 'title' => 'DESC',
'menu_order' => 'ASC' ) ) );

Questo ti permette di controllare la generazione della clausola ORDER BY con maggiore specificità:

ORDER BY post_title DESC, menu_order ASC

Prima della versione 4.0, avresti dovuto utilizzare filtri complessi sulla dichiarazione SQL o su una clausola specifica. Non era l'ideale.

1 apr 2025 01:05:52
Commenti

(Ho scritto questa risposta perché continuo a dimenticare questo, poi trovo questo post su SO, e poi trovo l'annuncio di WP.)

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

quando usi un plugin come Elementor e hai un campo personalizzato con nome date, aggiungi la seguente action nel file elementor-pro/elementor-pro.php nell'editor dei plugin.

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 dic 2020 17:17:55
Commenti

Come entra in gioco Elementor qui? Non c'è letteralmente alcuna menzione di Elementor nella domanda dell'OP o in qualsiasi risposta o commento successivo.

Tony Djukic Tony Djukic
30 dic 2020 02:01:14

@TonyDjukic, hai perfettamente ragione riguardo all'irrilevanza di Elementor. Ma poiché Google mi ha mostrato questa pagina dopo aver cercato il mio specifico errore riguardante la personalizzazione di WP_Query e ci è voluto del tempo per trovare la soluzione, ho pensato che potesse aiutare qualcun altro con lo stesso problema.

Iman Iman
7 gen 2021 18:30:28