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.
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
Penso che sarebbe di grande aiuto! Costruire la query in WordPress non dovrebbe essere un problema per me. – mensch
sarebbe molto meglio se è possibile aggiungere record di esempio con la tua domanda e il risultato desiderato. Grazie. –