Mam dwa niestandardowe typy postów „kraj” i „miasto” oraz wspólną flagę taksonomii.
Jeśli używam:
<?php $flags = get_terms('flag', 'orderby=name&hide_empty=0');
Otrzymuję listę wszystkich terminów w taksonomii, ale chcę ograniczyć listę do typu „kraj”.
Jak mogę to zrobić?
Korzystanie z nowego rozwiązania
<?php
$flags = wpse57444_get_terms('flags',array('parent' => 0,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($flags as $flag) {
$childTerms = wpse57444_get_terms('flags',array('parent' => $flag->term_id,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($childTerms as $childTerm) {
echo $childTerm->name.'<br />';
}
}
?>
Nie mogę powtórzyć nazwy $ childTerm-> name. Dlaczego?
custom-post-types
taxonomy
terms
użytkownik1443216
źródło
źródło
Odpowiedzi:
Obawiam się, że nie jest to możliwe natywnie (jeszcze?). Zobacz ten trac: http://core.trac.wordpress.org/ticket/18106
Podobnie na stronie administratora systematyki liczba postów odzwierciedla wszystkie typy postów. (
Jestem prawie pewien, że istnieje również bilet trac). Http://core.trac.wordpress.org/ticket/14084Zobacz także ten powiązany post .
Nowe rozwiązanie
Po napisaniu poniższego, opublikowałem znacznie lepszy sposób (przynajmniej w tym sensie, że możesz zrobić więcej), używając filtrów zawartych w
get_terms()
wywołaniu. Możesz utworzyć funkcję opakowania, która używaget_terms
i (warunkowo) dodaje filtr do manipulowania zapytaniem SQL (w celu ograniczenia według typu postu).Funkcja przyjmuje takie same argumenty jak
get_terms($taxonomies, $args)
.$args
bierze dodatkowy argument,post_types
którego bierze tablicę | ciąg typów postów.Ale nie mogę zagwarantować, że wszystko działa „zgodnie z oczekiwaniami” (myślę, że uzupełnię liczbę). Wygląda na to, że działa przy użyciu domyślnej opcji
$args
forget_terms
.Stosowanie
Oryginalne obejście
Zainspirowany powyższym biletem trac (przetestowany i działa dla mnie)
Stosowanie
lub
źródło
$args = array('parent'=>0,'orderby'=>'name','hide_empty'=>0);
. Zmienię to, aby zezwolić na ciągi zapytań ...$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
?wpse57444_get_terms()
$args
to drugi argument. Po prostu umieściłeśwpse57444_get_terms( 'flag', array( 'country', 'city' ) );
@ stephen-harris powyższa odpowiedź działała dla mnie tylko częściowo. Jeśli spróbowałem użyć go dwa razy na stronie, to nie działało. Martwi mnie też pomysł zakopywania takich zapytań mysql - myślę, że lepszą praktyką jest stosowanie podstawowych metod w celu uzyskania rozwiązania, aby uniknąć konfliktów z przyszłymi aktualizacjami WP. Oto moje rozwiązanie, oparte na komentarzu nr 7 do biletu Trac, do którego się odwołuje
Stosowanie:
Działa to tylko z jednym typem postu i jedną taksonomią, ponieważ tego właśnie potrzebowałem, ale nie byłoby trudno zmodyfikować to, aby zaakceptować wiele wartości.
W wątku Trac wspomniano, że może to nie być dobrze skalowane, ale pracuję na dość małej skali i nie miałem problemów z prędkością.
źródło
Dwa niestandardowe typy postów „kraj” i „miasto” oraz wspólna „taksonomia” taksonomii. Chcesz ograniczyć listę do typu posta „kraj”.
Oto prostsze rozwiązanie:
źródło
[edytuj] To jest komentarz do doskonałej odpowiedzi Stephena Harrisa.
Nie zwraca żadnych terminów, jeśli jest używany z wieloma typami postów jak ten
$flags = wpse57444_get_terms('flags', array('post_types' => array('country','city')));
. Wynika to z faktu, że $ wpdb-> preparat dezynfekuje ciąg $ post_types_str, nap.post_type IN('country,city')
jaki powinien byćp.post_type IN('country','city')
. Zobacz ten bilet: 11102 . Skorzystaj z rozwiązania z tego tematu, aby obejść ten problem: /programming//a/10634225źródło
Próbowałem także użyć odpowiedzi @ Stephen Harris, ale zapytania, którego potrzebowałem, było dość trudne do napisania jako jedno zapytanie i przy użyciu elementów filtrujących.
Ponadto musiałem używać tej funkcji wiele razy na tej samej stronie i rozwiązałem problem z zadeklarowaniem
wpse_filter_terms_by_cpt
funkcji poza funkcją otoki.W każdym razie odpowiedź @Marka Pruce'a, moim zdaniem, pasuje lepiej, z tych samych powodów, które powiedział, nawet jeśli trzeba zrobić jeszcze jedno zapytanie (i powiązaną pętlę), aby przygotować argumenty dla
wp_get_object_terms
funkcji.źródło