Ottenere gli ultimi post di tutte le categorie con una singola query
Il mio blog WordPress ha 12 categorie principali e 80 sottocategorie.
Devo recuperare l'ultimo post pubblicato per ognuna di queste 12 categorie principali.
So come farlo con 12 query separate usando get_posts(), ma esiste un modo per ottenerli con una singola query?
Ho provato questa soluzione ma restituisce più di 12 post:
// Ottieni array delle categorie (solo livello 0)
$cats= array();
$categories=get_categories($args);
foreach($categories as $category) {
if ($category->parent == 0) {
$cats[]= $category->term_id ;
}
}
$categories= implode(',',$cats);
// Recupera l'ultimo post di ogni categoria
global $wpdb;
$querystr = "SELECT wposts.*
FROM $wpdb->posts wposts
LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->term_taxonomy.term_id IN($categories)
ORDER BY wposts.post_date DESC";
$pageposts = $wpdb->get_results($querystr, OBJECT);
E poi il loop:
global $post;
foreach ($pageposts as $k=>$post):
setup_postdata($post);
// ... wp loop attraverso i risultati
}
La quantità di query non è l'unica misura delle prestazioni, una singola query può costare più di numerose query semplici.
Il costo di (query piccola) x12 < costo di query grande x1 + manipolazione di stringhe/array
Sarebbe meglio fare le 12 query individuali. Se è costoso, memorizza il risultato in un transient per un utilizzo successivo e risparmiare elaborazione.
Ma ancora meglio, potresti anche aggiornare i valori usando un hook su save_post in modo che non sia necessario effettuare una 'ricerca', e diventa una semplice operazione di recupero di un valore memorizzato. In questo modo, se lo memorizzi e lo recuperi via get_option, non verranno eseguite query extra poiché WordPress ha già caricato il valore e non effettuerà una query SQL non necessaria per recuperarlo una seconda volta.
// in functions.php
function check_category_latest($post_id){
// controlla le categorie a cui è assegnato questo post
// per ogni categoria a cui è assegnato
// se è il più recente in quella categoria
set_option('mytheme_cat_'.$term_id,$post_id);
}
add_hook('save_post','check_category_latest');
// dove vuoi visualizzare i tuoi post
$categories=get_categories($args);
foreach($categories as $category) {
$post_id = get_option('mytheme_cat_'.$category->term_id);
// fai operazioni di visualizzazione del post
}
Qualcosa di simile a queste linee ti darà ciò che vuoi, e lo farà anche per tutte le sottocategorie, e sarà molto più economico di 12 query individuali, o anche della singola query grande e costosa
