2013-03-04 8 views
5

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.

+0

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

+0

Myślę, że byłaby to wielka pomoc! Budowanie zapytania w WordPress nie powinno być dla mnie problemem. – mensch

+0

byłoby znacznie lepiej, gdyby można dodać przykładowe rekordy wraz z pytaniem i pożądanym wynikiem. Dzięki. –

Odpowiedz

2

Ok tutaj jest moja odpowiedź (to bardziej sugestia)

Moja aproach byłoby najpierw wybrać każdy identyfikator ze słupkami to najnowsza w ich perspektywie i należy do taksonomii post-serii.

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 pogrupowane według d.name bo chcesz jeden wpis o tej nazwie i używać mając ponieważ chcesz jeden wpis, który ma post_date max

potem wybiorę wszystkie identyfikatory, które pojawiają się od tego zapytaj i używaj ich w klauzuli

Nie mogłem tego przetestować, ale tak to rozwiązałem w mysql.

+0

Dzięki, ale niestety to nie działa. MySQL podaje błąd dotyczący nieznanych kolumn w trzeciej instrukcji SELECT (wp_posts). I w sekcji HAVING.Zmieniając je na 'a.ID' i' a.post_date' uruchommy zapytanie bez błędu, ale nie zwróci ono żadnych wierszy. Wygląda na to, że jest spowodowane przez drugie podzapytanie, które nie zwraca żadnych wyników. – mensch

+0

Usuwanie 'HAVING' zwraca jeden wiersz, który jest w taksonomii serii, ale nie inne posty w kategorii kategorii. – mensch

+0

ok jedną rzeczą, której nie wiedziałem na pewno, jest to, że 'a.ID = b.object_id' czy możesz potwierdzić, że id_obiektu jest identyfikatorem postu i możesz zmienić grupę przez 'group by d.name, a.post_date ', więc otrzymujesz więcej niż jeden wiersz. – Miguelo

Powiązane problemy