Ottenere gli ultimi post di tutte le categorie con una singola query

3 ott 2011, 02:51:54
Visualizzazioni: 1.42K
Voti: 0

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


}
0
Tutte le risposte alla domanda 1
1

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

3 ott 2011 19:29:37
Commenti

Il tuo suggerimento di salvarlo come opzione è molto intelligente. Potrei davvero farlo!

pixeline pixeline
12 ott 2011 13:38:22