Estou trabalhando em um modelo de página de termo de taxonomia personalizado em que queremos que os itens conectados ao termo sejam classificados por uma data de publicação (campo de data personalizado) - e se houver vários itens no mesmo dia (formatado como AAAA-MM- DD) para classificá-las por título e, finalmente, classificar por título, se o campo personalizado não tiver sido preenchido (itens mais antigos).
Então, tentei centenas de maneiras diferentes com um WP_query e ele retornou a maioria dos resultados como eu os desejava - mas, neste caso, está retornando apenas os itens que possuem a meta_key de publicação_data. Todos os outros itens estão sendo ignorados e não são exibidos. Eu tentei uma meta_query usando uma relação de "ou" e comparei a publicação_data como EXISTS e NOT EXISTS, mas isso retornou 0 resultados para mim.
Além disso, o site ainda está executando o 3.5.2 e eles não desejam atualizar.
Aqui está minha consulta mais recente que mostra as postagens que têm o campo personalizado de publicação_data exibido na ordem correta:
$term = get_queried_object(); // find the term of the taxonomy page we are on
$wp_query = new WP_Query( array(
'post_type' => 'resource',
'tax_query' => array(
array(
'taxonomy' => 'resource_types',
'field' => 'slug',
'terms' => $term->name,
)),
'meta_key' => 'publication_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
'posts_per_page' => '10',
));
Também tentei usar o wpdb e executar uma consulta SQL, mas realmente não sei como realizar o que quero fazer isso. Se alguém pudesse me ajudar, isso seria incrível!
Desde já, obrigado.
fonte
'meta_query' => array( 'relation' => 'OR', array( //check to see if date has been filled out 'key' => 'publication_date', 'compare' => '!=', 'value' => date('Y-m-d'), ), array( //if no date has been added show these posts too 'key' => 'publication_date', 'value' => date('Y-m-d'), 'compare' => 'NOT EXISTS' ) ),
mas a ordem não está funcionando: \Respostas:
Obrigado a todos por sua ajuda!
No final, a consulta abaixo obteve os resultados que eu desejava - que era para mostrar e classificar as postagens por um campo personalizado de "publicação_data" primeiro - classificando pela data e se houvesse várias da mesma data (por exemplo, 4 marcadas Junho de 2013), os classificaria por título. Depois, após executar todas as postagens que têm a Data de Publicação preenchida, percorrerá novamente as postagens restantes, em ordem alfabética por título.
Isso recebe os resultados definidos na mesma consulta e mantém minha paginação:
fonte
meta_query
na mesma chave!meta_key
lo automaticamente, não o incluireiNOT EXISTS
. Eu realmente espero que esteja fazendo algo errado.'meta_key' => 'publication_date',
.Poucos anos depois, o código postado por CSSGirl não estava funcionando para mim porque havia algumas postagens que não tinham a meta-chave ou a meta-chave estava vazia, então era isso que eu precisava fazer para ter todas as postagens ordenadas por data e mostre os que apresentam um valor de meta-chave primeiro:
fonte
Eu acho que você precisaria fazer 2 loops separados. Você pode capturar todas as postagens encontradas no primeiro loop e excluí-las do loop secundário com bastante facilidade:
Em seguida, execute seu segundo loop.
fonte
echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?page=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $publication_query->max_num_pages, 'prev_text' => __('Previous |'), 'next_text' => __('| Next'), ) );
Existe algum motivo para que você não possa impor a meta-chave publicação_data a existir para cada postagem apenas com um valor vazio?
Portanto, em sua
save_post
ação, você adicionaria / atualizaria a meta-chave, independentemente de o$_POST
valor estar vazio ou não.Você precisaria executar um script de atualização para percorrer as postagens mais antigas e adicionar a chave com um valor vazio, por exemplo:
Execute-o navegando para http://example.com/wp-admin/?update_old_posts
Então você pode usar a mesma consulta que você possui. Convém adicionar um filtro extra para permitir que você ordene por colunas diferentes em direções diferentes; faria sentido para mim classificar por data em ordem decrescente e título em ordem crescente.
fonte
Eu criei uma cláusula where personalizada. Eu testei usando
$wp_query->request
antes do meu loop principal, eu realmente não conheço SQL tão bem, mas isso pareceu fazer as coisas funcionarem.Alternativamente, você pode definir
compare
a'EXISTS'
e altere a linha em add_trending_where para$where .= " OR ($wpdb->postmeta.post_id IS NULL)";
. Então você só precisa alterar o valor da chave em um só lugar. Mais uma vez, ecoe$wp_query->request
e divirta-se, se você quiser entender isso melhor ou ajustá-lo.Edição: Acabei de perceber que isso não funciona se
meta_key
estiver definido na consulta. Você pode usar$query->set('meta_key', NULL);
se precisar.Edição 2: eu tenho isso trabalhando com o método acima. Por alguma razão, não foi a princípio (talvez meta_key tenha sido configurada ... eu não sei).
fonte