2013-03-04 11 views
5

Ho una tassonomia personalizzata che utilizzo per raggruppare i post in serie (una serie è un termine in quella tassonomia). Quello che vorrei è trattare questi post in bundle come casi speciali durante l'esecuzione del ciclo WordPress.Mostra l'ultimo post per data da una tassonomia personalizzata nel ciclo WordPress

Solo il primo post della serie (quello con la data più recente) deve essere visualizzato e tutti gli altri post non appartenenti a un termine nella tassonomia personalizzata devono essere considerati come post normali. Oltre alla tassonomia delle serie personalizzate, i post possono anche essere taggati o classificati (quindi un massimo di tre tassonomie, inclusa quella personalizzata). Il ciclo dovrebbe contenere un numero fisso di post (ad esempio il numero di post sulla prima pagina impostata nel backend di WordPress).

Non riesco a raggruppare questi post, in parte perché tutti i dati si trovano in tabelle diverse e poiché ogni voce può appartenere a più tassonomie. Ovviamente il looping sull'array dei post, scartando i post più vecchi della serie dopo la chiamata MySQL è una possibilità, ma in quel caso il numero fisso di post è difficile da mantenere senza fare ulteriori query al database.

Quindi vorrei implementare una soluzione SQL pura. Ho sperimentato usando il gancio posts_clauses. Questa query sotto restituisce il post con l'ID più alto, non la data, in una serie ed è piuttosto tassativo sul database, credo.

$clauses['fields'] .= ", $wpdb->posts.ID AS postID, (SELECT $wpdb->terms.term_id 
    FROM $wpdb->posts, $wpdb->term_taxonomy, $wpdb->term_relationships, $wpdb->terms  
    WHERE $wpdb->posts.ID=postID 
    AND $wpdb->term_taxonomy.taxonomy='post-series' 
    AND $wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id 
    AND $wpdb->posts.ID=$wpdb->term_relationships.object_id 
    AND $wpdb->terms.term_id=$wpdb->term_taxonomy.term_id 
    ORDER BY $wpdb->posts.post_date DESC 
    LIMIT 0,1) AS uniqueID"; 

$clauses['groupby'] = "IFNULL(uniqueID,$wpdb->posts.ID)"; 

Sulla base delle clausole di cui sopra WordPress costruisce la seguente query SQL:

SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_posts.ID AS postID, 
    (SELECT wp_terms.term_id FROM wp_posts, wp_term_taxonomy, wp_term_relationships, wp_terms 
    WHERE wp_posts.ID=postID 
     AND wp_term_taxonomy.taxonomy='post-bundles' 
     AND wp_term_relationships.term_taxonomy_id=wp_term_taxonomy.term_taxonomy_id 
     AND wp_posts.ID=wp_term_relationships.object_id 
     AND wp_terms.term_id=wp_term_taxonomy.term_id 
    ORDER BY wp_posts.post_date DESC LIMIT 0,1) 
    AS uniqueID FROM wp_posts 
WHERE 1=1 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
GROUP BY IFNULL(uniqueID,wp_posts.ID) 
ORDER BY wp_posts.post_date DESC 
LIMIT 0, 10 

Ho anche letto this tutorial, ma io non sono sicuro che si applica in questo caso.

Quindi per riassumere: Nel ciclo voglio solo mostrare l'ultimo post (ordinato per post_date) appartenente a un termine da una tassonomia personalizzata ed escludere altri post in quella tassonomia nel ciclo. Il ciclo contiene anche post regolari che non fanno parte della tassonomia personalizzata e entrambi i tipi possono appartenere a più categorie e avere tag.

+0

c'è qualche utilità per te se pubblico la query sql che dovrebbe fare il trucco. come non so nulla sul modo in cui wordpress costruisce la query? – Miguelo

+0

Penso che sarebbe di grande aiuto! Costruire la query in WordPress non dovrebbe essere un problema per me. – mensch

+0

sarebbe molto meglio se è possibile aggiungere record di esempio con la tua domanda e il risultato desiderato. Grazie. –

risposta

2

Ok qui è la mia risposta (è più un suggerimento)

mio aproach sarebbe prima selezionare ogni id dai pali che è il più recente nel loro termine e appartiene alla tassonomia post-series.

select * from wp_posts where ID in(
select ID from 
(
select wp_posts.ID , wp_posts.post_date, d.name from wp_posts as a 
join wp_term_relationships as b on (a.ID = b.object_id) 
join wp_term_taxonomy as c on (b.term_taxonomy_id = c.term_taxonomy_id) 
join wp_terms as d on (c.term_id = d.term_id) 
where c.taxonomy = 'post-series' 
group by d.name 
having (wp_posts.post_date = max(wp_posts.post_date)) 
)tmp) 

i raggruppate per d.name perché si vuole una voce per quel nome e utilizzare avendo perché si vuole quella voce che ha la massima POST_DATE

quindi seleziono tutti i id che emergono da quel interrogarli e usarli nella clausola where ID in()

Non ho potuto testare questo ma questo è come lo risolverei in mysql.

+0

Grazie, ma sfortunatamente non sembra funzionare. MySQL fornisce un errore riguardante le colonne sconosciute nella terza istruzione SELECT (wp_posts). E nella sezione HAVING.Cambiando quelli in 'a.ID' e' a.post_date', la query viene eseguita senza errori, ma non restituisce alcuna riga. Sembra essere causato dalla seconda sottoquery, che non restituisce alcun risultato. – mensch

+0

La rimozione di "HAVING" restituisce una riga, che si trova nella tassonomia della serie, ma non gli altri nella tassonomia della categoria. – mensch

+0

ok una cosa che non sapevo è se 'a.ID = b.object_id' puoi confermare che object_id è l'id del post e potresti cambiare il gruppo con 'group by d.name, a.post_date 'così ottieni più di una riga. – Miguelo

Problemi correlati