Ordina per DESC, ASC in WP_Query personalizzato


8

Ho bisogno di fare un ordine multi-livello in una query. Il problema è con l'ordine di un valore DESC e l'altro ASC come in SQL. Il seguente SQL sembra darmi quello che voglio quando lo 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 pb_issue_featuredè un valore booleano. Il risultato finale di cui ho bisogno è la query per visualizzare i post che hanno un meta valore di 1 per questo campo in alto, quindi tutti gli altri sotto. Quindi l'ordinamento di secondo livello è quello designato menu_order(sto usando il plug-in per l'ordine dei tipi di posta).

Il problema è che il mio valore booleano deve essere ordinato da alto a basso (da 1 a 0) ma menu_order è l'opposto. Ciò che viene ordinato per primo con il plug-in ha un ordine di menu pari a 1. Quindi l'utilizzo di 'orderby' incorporato in WP_Query non funziona. Qualcuno ha suggerimenti? Ho esaminato il filtro "posts_orderby" ma non sono riuscito a prenderlo. Non ero davvero sicuro di dove dovesse essere applicato o come avrei potuto risolverlo. Semplicemente non ha riordinato come avevo fatto io.

Grazie per l'aiuto! Pubblicherò il WP_Query reale se è pertinente ma volevo mantenerlo il più breve possibile.

La query args:

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

Bene, dovresti pubblicare WP_Query, per vedere se è formato correttamente.
Marin Bînzari,

Eccolo in tutto ciò che è gloria. Al momento non sto ordinando altro che quel valore booleano b / c che era l'unico modo per far funzionare quel livello o l'ordinamento. Il sito utilizza anche post "titoli" che hanno la precedenza sui post "in primo piano". Quindi li escludo in questa domanda
ian il

Risposte:


20

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' => '!=' 
                )
            )
        );

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

Come un capo Spartakus. Grazie per la risposta concisa e accurata. Funzionava come un incantesimo
ian il

1
È inoltre possibile utilizzare un array nell'ordine per clausola (WP 4.0 e
versioni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.