Eu tenho 3 categorias com cada 15 postagens, quero fazer UMA consulta ao banco de dados trazendo apenas 5 primeiras postagens para cada categoria, como posso fazer isso?
$q = new WP_Query(array( 'post__in' => array(2,4,8), 'posts_per_page' => **FIRST_5_OF_EACH_CAT** ));
Caso isso não seja possível, o que é mais eficiente, obter todas as postagens da categoria pai e percorrer todas elas ou criar 3 consultas diferentes?
query-posts
Amit
fonte
fonte
Respostas:
O que você deseja é possível, mas exigirá que você mergulhe no SQL, que eu gosto de evitar sempre que possível (não porque eu não o conheça, sou um desenvolvedor avançado de SQL, mas porque no WordPress você deseja usar a API sempre que possível para minimizar futuros problemas de compatibilidade relacionados a possíveis alterações na estrutura do banco de dados.)
SQL com um
UNION
operador é uma possibilidadePara usar o SQL que você precisa é de um
UNION
operador em sua consulta, algo como isto assumindo suas lesmas categoria são"category-1"
,"category-1"
e"category-3"
:Você pode usar o SQL UNION com um
posts_join
filtroUsando o acima, você pode simplesmente fazer a chamada diretamente ou pode usar um
posts_join
gancho de filtro da seguinte maneira; note que estou usando um heredoc PHP, portanto, certifique-se de que eleSQL;
esteja nivelado à esquerda. Observe também que usei uma var global para permitir que você defina as categorias fora do gancho, listando as lesmas de categoria em uma matriz. Você pode colocar esse código em um plug-in ou nofunctions.php
arquivo do seu tema :Mas pode haver efeitos colaterais
É claro que usar os ganchos de modificação de consulta como
posts_join
sempre convida a efeitos colaterais, pois eles agem globalmente em consultas e, portanto, você geralmente precisa agrupar suas modificações de uma maneiraif
que só a use quando necessário e que critério testar pode ser complicado.Concentre-se na otimização?
No entanto, suponho que sua pergunta esteja mais relacionada à otimização do que à possibilidade de fazer uma consulta das cinco principais vezes, certo? Se for esse o caso, talvez haja outras opções que usam a API do WordPress?
Melhor usar a API de transientes para cache?
Presumo que suas postagens não sejam alteradas com frequência, correto? E se você aceitar a consulta de três (3) resultados periodicamente e depois armazenar em cache os resultados usando a API Transients ? Você obterá código sustentável e ótimo desempenho; um pouco melhor que a
UNION
consulta acima, porque o WordPress armazenará as listas de postagens como uma matriz serializada em um registro dawp_options
tabela.Você pode pegar o exemplo a seguir e soltar na raiz do seu site como
test.php
para testar isso:Sumário
Embora sim, você pode fazer o que pediu usando uma
UNION
consulta SQL e oposts_join
gancho de filtro. Provavelmente, é melhor oferecer o armazenamento em cache com a API Transients .Espero que isto ajude?
fonte
WP_Query()
não suporta algo como o Primeiro X para cada gato . Em vez deWP_Query()
você pode usarget_posts()
em cada uma de suas categorias, por assim dizer três vezes:$posts
agora contém as cinco primeiras postagens para cada categoria.fonte
Não sei como obter as cinco primeiras postagens para cada uma das categorias em uma única consulta. Se você tiver apenas 45 postagens, acessar o banco de dados uma vez e obter suas cinco postagens para cada categoria é provavelmente a abordagem mais eficiente. Atingir o banco de dados três vezes e combinar os resultados não é uma coisa ruim.
fonte