Ordinare per DESC, ASC in WP_Query personalizzata
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);
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;
}

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 perorderby
. 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.

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 );
} );

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

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