Mam niestandardową systematykę, której używam do grupowania wpisów w seriach (seria jest terminem w tej taksonomii). Chciałbym traktować te dołączone posty jako specjalne przypadki podczas wykonywania pętli WordPress.Pokaż ostatni post według daty z niestandardowej taksonomii w pętli WordPress.
Wyświetlany powinien być tylko pierwszy wpis z serii (ten z najnowszą datą), a wszystkie pozostałe posty, które nie należą do terminu w niestandardowej taksonomii, powinny być traktowane jako zwykłe posty. Oprócz niestandardowej taksonomii serii, posty mogą być również oznaczane tagami lub kategoryzowane (więc maksymalnie trzy taksonomie, w tym niestandardowe). Pętla powinna zawierać stałą liczbę postów (np. Liczbę postów na pierwszej stronie ustawioną w zapleczu WordPress).
Nie mam pojęcia, jak pogrupować te posty, częściowo dlatego, że wszystkie dane znajdują się w różnych tabelach i ponieważ każdy wpis może należeć do wielu taksonomii. Oczywiście zapętlając tablicę posts, odrzucając starsze posty z serii po wywołaniu MySQL jest możliwa, ale w takim przypadku stała liczba postów jest trudna do utrzymania bez dodatkowych zapytań do bazy danych.
Chciałbym zatem wprowadzić rozwiązanie czystego SQL. Eksperymentowałem z hakiem posts_clauses
. Poniższe zapytanie zwraca post z najwyższym identyfikatorem, a nie datą, w serii i jest raczej podatne na bazę danych, jak sądzę.
$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)";
Na podstawie powyższych klauzul WordPress tworzy następujące zapytanie 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
Ja również czytać this tutorial, ale nie jestem pewien, że zastosowanie w tym przypadku.
Podsumowując: w pętli chcę tylko wyświetlić ostatni wpis (zamówiony przez post_date) należący do terminu z niestandardowej taksonomii i wykluczyć inne posty w tej taksonomii w pętli. Pętla zawiera również zwykłe posty, które nie są częścią niestandardowej taksonomii, a oba typy mogą należeć do wielu kategorii i zawierać znaczniki.
jest przydatne dla ciebie, jeśli mogę wysłać zapytanie sql, które powinno załatwić sprawę. jako że nie wiem nic o sposobie budowania zapytania przez wordpress? – Miguelo
Myślę, że byłaby to wielka pomoc! Budowanie zapytania w WordPress nie powinno być dla mnie problemem. – mensch
byłoby znacznie lepiej, gdyby można dodać przykładowe rekordy wraz z pytaniem i pożądanym wynikiem. Dzięki. –