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 possibilidade
Para 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"
:
SELECT * FROM wp_posts WHERE ID IN (
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-1'
LIMIT 5
UNION
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-2'
LIMIT 5
UNION
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-3'
LIMIT 5
)
Você pode usar o SQL UNION com um posts_join
filtro
Usando 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 ele SQL;
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 no functions.php
arquivo do seu tema :
<?php
global $top_5_for_each_category_join;
$top_5_for_each_category_join = array('category-1','category-2','category-3');
add_filter('posts_join','top_5_for_each_category_join',10,2);
function top_5_for_each_category_join($join,$query) {
global $top_5_for_each_category_join;
$unioned_selects = array();
foreach($top_5_for_each_category_join as $category) {
$unioned_selects[] =<<<SQL
SELECT object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='{$category}'
LIMIT 5
SQL;
}
$unioned_selects = implode("\n\nUNION\n\n",$unioned_selects);
return $join . " INNER JOIN ($unioned_selects) categories ON wp_posts.ID=categories.object_id " ;
}
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 maneira if
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 da wp_options
tabela.
Você pode pegar o exemplo a seguir e soltar na raiz do seu site como test.php
para testar isso:
<?php
$timeout = 4; // 4 hours
$categories = array('category-1','category-2','category-3');
include "wp-load.php";
$category_posts = get_transient('top5_posts_per_category');
if (!is_array($category_posts) || count($category_posts)==0) {
echo "Hello Every {$timeout} hours!";
$category_posts = array();
foreach($categories as $category) {
$posts = get_posts("post_type=post&numberposts=5&taxonomy=category&term={$category}");
foreach($posts as $post) {
$category_posts[$post->ID] = $post;
}
}
set_transient('top5_posts_per_category',$category_posts,60*60*$timeout);
}
header('Content-Type:text/plain');
print_r($category_posts);
Sumário
Embora sim, você pode fazer o que pediu usando uma UNION
consulta SQL e o posts_join
gancho de filtro. Provavelmente, é melhor oferecer o armazenamento em cache com a API Transients .
Espero que isto ajude?