Classificação: consulta personalizada com orderby meta_value_num THEN por título


8

tento executar uma consulta de tipo de postagem personalizada para corresponder aos seguintes critérios:
classifique os filmes primeiro por ano em ordem decrescente,
depois ("dentro" da ordem do ano) por título em ordem alfabética.

saída desejada:
título do filme A, 2006
título do filme Z, 2006
...
título do filme A, 1996
título do filme Z, 1996

eu uso o seguinte código:

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

Eu tentei várias coisas, mas só consigo esse resultado "inverso":

título do filme A, 1996
título do filme Z, 1996
...
título do filme A, 2006
título do filme Z, 2006

se eu alterar DESC, ASC, apenas altera a classificação do título. mas preciso aplicá-lo ao ano e não ao título.

é o caminho certo para usar dois valores orderby? ou eu tenho que usar uma meta_query ou SQL personalizado?

thx antecipadamente!

Aqui está a consulta SQL resultante de $GLOBALS['wp_query']->request

Wp_posts SELECT. *
DE wp_posts
       INNER JOIN wp_term_relationships
               EM (wp_posts.id = wp_term_relationships.object_id)
       INNER JOIN wp_postmeta
               EM (wp_posts.id = wp_postmeta.post_id)
em que 1 = 1
       E (wp_term_relationships.term_taxonomy_id EM (24))
       E wp_posts.post_type = 'filmes'
       AND (wp_posts.post_status = 'publique')
       AND (wp_postmeta.meta_key = 'ano')
GRUPO BY wp_posts.id
ORDEM POR wp_postmeta.meta_value + 0,
          wp_posts.post_title DESC 

Respostas:


1

Isso é muito grosseiro, mas você deve classificar suas postagens por ano (meta_value) e depois por título. Depende de como a consulta está configurada, portanto, ela funcionará apenas com a consulta abaixo ou com outras semelhantes.

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

funciona! Muito obrigado. i mudou ASC para DESC embora na função alter_order para ordenar A a Z.
kyii

ASCdeve encurtar AZ; DESCdeve classificar ZA.
s_ha_dum

1

Seu problema não é tanto com orderbycomo com order. Embora orderbyaceite vários valores e seu uso pareça aceitável, order apenas aceita ASC ou DESC .

Após a higienização, orderé anexado à saída do orderbyprocessamento. Se eu entendi direito a lógica, isso significa que, dentre vários orderbyparâmetros, orderserá aplicado o último listado.

Tente reverter orderbypara 'title meta_value_num'que o título seja classificado por padrão e orderse aplique ao ano em vez do título.


obrigado primeiro. mas, infelizmente, se eu inverter os valores i obter uma ordem de classificação apenas AZ meta_value_num ignorando (adivinhar a partir do fato de que é a mesma ordem, independentemente se a ordem é DESC ou ASC)
kyii

@kyii Não sei ao certo o que você quer dizer com "mesma ordem, independentemente"?
Rarst

desculpa. se eu inverter, como você sugeriu, recebo uma ordem de AZ das postagens, que permanece a mesma, embora eu altere o order =>parâmetro no formulário de consulta ASC para DESC e retorne. então eu acho que o meta_value_num não é aplicado. então o seu ponto interessante sobre a lógica da interação de ORDER e ORDERBY talvez seja de alguma forma diferente? ou estou fazendo errado?
kyii

@kyii não tenho certeza ... eu tentaria despejar a consulta resultante com diferentes combinações. No entanto, acho que você precisaria modificar o SQL no final, essa lógica é muito restritiva para tipos mais complexos.
Rarst
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.