Ordinamento: query personalizzata con ordine per meta_value_num THEN per titolo


8

provo a eseguire una query di tipo di post personalizzato in base ai seguenti criteri:
ordina i filmati per primo in ordine decrescente,
successivamente ("all'interno" dell'ordine dell'anno) in base al titolo in ordine alfabetico.

risultato desiderato:
titolo del film A,
titolo del film Z 2006, 2006
...
titolo del film A, 1996
titolo del film Z, 1996

io uso il seguente codice:

$wp_query = new WP_Query();
$wp_query->query( array(
'post_type' => 'movies', 
                      'distribution' => 'companyA', 
                      'meta_key' => 'year',
                      'orderby' => 'meta_value_num title',  
                      'order' => 'DESC', 
                      'posts_per_page' => -1, 
                      'post_status' => 'publish',
));

ho provato diverse cose ma posso ottenere solo questo risultato "inverso":

titolo del film A, 1996
titolo del film Z, 1996
...
titolo del film A, 2006
titolo del film Z, 2006

se cambio DESC, ASC cambia solo l'ordinamento del titolo. ma devo applicarlo all'anno e non al titolo.

è il modo giusto di usare due valori di ordine? o devo usare una meta_query o un SQL personalizzato?

grazie in anticipo!

Ecco la query SQL risultante da $GLOBALS['wp_query']->request

SELEZIONA wp_posts. *
FROM wp_posts
       INNER JOIN wp_term_relationships
               ON (wp_posts.id = wp_term_relationships.object_id)
       INNER JOIN wp_postmeta
               ON (wp_posts.id = wp_postmeta.post_id)
WHERE 1 = 1
       AND (wp_post_id)
       wp_post_id_post_id = 'films'
       AND (wp_posts.post_status = 'publishing')
       AND (wp_postmeta.meta_key = 'year')
GRUPPO DI wp_posts.id
ORDINA PER wp_postmeta.meta_value + 0,
          wp_posts.post_title DESC 

Risposte:


1

Questo è molto rozzo ma dovrebbe ordinare i tuoi post per anno (meta_value) e poi per titolo. Dipende da come è impostata la query, quindi funzionerà solo con la query di seguito o con quelle simili.

function alter_order_wpse_103181($order,$qry) {
  remove_filter('posts_orderby','alter_order',1,2);
  $order = explode(',',$order);
  $order = implode( ' ASC,',$order);
  return $order;
}
add_filter('posts_orderby','alter_order_wpse_103181',1,2);

$q = new WP_Query();
$q->query( array(
  'post_type' => 'movies', 
  'distribution' => 'companyA', 
  'meta_key' => 'year',
  'orderby' => 'meta_value_num title',  
  'order' => 'ASC', 
  'posts_per_page' => -1, 
  'post_status' => 'publish',
));
var_dump($q->request);

Funziona! Grazie mille. ho cambiato ASC in DESC anche se nella funzione alter_order per ordinare dalla A alla Z.
kyii il

ASCdovrebbe corto AZ; DESCdovrebbe ordinare ZA.
s_ha_dum,

1

Il tuo problema non è tanto con orderbyquanto con order. Mentre orderbyaccetta più valori e il tuo utilizzo sembra ok, accetta order solo ASC o DESC .

Dopo la sanificazione orderviene aggiunto all'output orderbydell'elaborazione. Se capisco il diritto logico che significa che su più orderbyparametri, ordersi applicherà all'ultimo elencato.

Prova a tornare orderbyal 'title meta_value_num'modo in cui il titolo è ordinato per impostazione predefinita e si orderapplica all'anno anziché al titolo.


grazie raramente. ma sfortunatamente se invertisco i valori ottengo un ordinamento solo AZ che ignora meta_value_num (indovinando dal fatto che è lo stesso ordine indipendentemente dal fatto che ORDER sia DESC o ASC)
kyii

@kyii Non sono sicuro di cosa intendi per "stesso ordine a prescindere"?
Rarst

scusa. se al contrario, come hai suggerito, ottengo un ordine AZ dei post, che rimane lo stesso anche se cambio il order =>parametro nel modulo di query ASC in DESC e viceversa. quindi immagino che il meta_value_num non sia applicato. quindi il tuo punto interessante sulla logica dell'interazione di ORDER e ORDERBY è forse in qualche modo diverso? o sto sbagliando?
Kyii,

@kyii non sono sicuro ... Proverei a scaricare la query risultante con combinazioni diverse. Tuttavia, penso che alla fine dovresti modificare SQL, questa logica è troppo restrittiva per tipi più complessi.
Rarst
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.