Estive modificando a pesquisa WP incorporada usando o pre_get_posts
filtro, permitindo que o usuário classifique as postagens (incluindo vários tipos personalizados de postagens) por campos diferentes.
O problema que estou tendo é que, quando digo ao WP para classificar por um meta-valor, ele exclui todas as postagens que não têm esse meta-valor definido. Isso faz com que o número de resultados mude se você alterar a classificação de dizer "Preço" para "Data" porque "Postagens" não têm "Preço" definido, mas "Itens" sim.
Não é isso que eu quero, então eu gostaria de saber se há uma maneira de incluir TODAS as postagens - mesmo aquelas que não possuem o valor meta que eu estou classificando - e colocar a que está sem o valor por último.
Eu sei como classificar em mais de um campo, mas isso não ajuda.
obrigado
Parece que eu não sou o único com esta pergunta: Maneira de incluir posts com e sem determinada meta_key em args para wp_query? mas não há solução lá.
Atualizar
Eu tentei a resposta, mas não tenho certeza se entendi corretamente, eis o que tenho agora:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
O meta-valor é um número (é usado para armazenar um preço como o nome sugere)
Atualização 2
Eu comentei as coisas do pedido e tudo o que tenho agora é o seguinte:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
Com esse código, a consulta parece retornar todas as postagens que não possuem a item_price
chave e nenhuma das postagens que a possuem. Ou seja, o problema agora está invertido.
Se eu adicionar o código do pedido, também recebo 0 resultados.
Edit: ... três anos depois ... : PI teve esse problema novamente. Eu tentei todas as respostas dadas e nenhuma funcionou. Não sei por que algumas pessoas parecem pensar que funcionam, mas pelo menos não funcionam para mim.
A solução que eu acabei usando é usar o save_post
filtro - certificando-se de que todas as postagens tenham o campo personalizado que eu gostaria de classificar. É um pouco chato eu ter que fazer isso, mas contanto que você faça isso desde o início, provavelmente não terá problemas.
Nesse caso, eu estava criando um "contador de visualizações" nas postagens e queria que os usuários pudessem classificar as postagens mais lidas. Novamente, as postagens que nunca foram visualizadas (acho que é bastante improvável - mas ainda assim) desapareceram ao classificar a contagem de visualizações. Adicionei este código para garantir que todas as postagens tenham uma contagem de visualizações:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
e tax_query
são sempre um array( array() )
, pois combinam várias matrizes. Segundo - como mencionado na minha resposta - você precisa usar meta_value_num
para números. Também pode ser necessário definir realmente meta_value_num
(consulte a WP_Query
entrada de página -Codex). Última, não faz sentido order
em ASC
e DESC
direção. Isso não é possível. O delimitador de espaço funciona apenas para orderby
e você não pode ordená-lo para classificar o primeiro ASC
e o segundo DESC
. É para isso que posts_clauses
serve o filtro.
meta_value_num
entradas são números reais . Viu com muita frequência que alguém afirma que é um número, mas na verdade salvou-o como uma sequência no banco de dados.
ASC DESC
isso é que ele classifica o meta_value
in ASC
e o date
in DESC
, até onde eu sei que funciona.