Mam 2 niestandardowe typy „zakładek” i „fragmentów” oraz wspólny „tag” taksonomii. Mogę wygenerować listę wszystkich terminów w taksonomii za pomocą get_terms (), ale nie mogę wymyślić, jak ograniczyć listę do typu postu. W zasadzie szukam czegoś takiego:
get_terms(array('taxonomy' => 'tag', 'post_type' => 'snippet'));
Czy istnieje sposób na osiągnięcie tego? Pomysły są bardzo mile widziane !!
Och, jestem na WP 3.1.1
custom-post-types
custom-taxonomy
terms
Gavin Hewitt
źródło
źródło
print_r(get_terms_by_post_type(array('category') , array('event') ));
pokazujeWarning: Missing argument 2 for wpdb::prepare()
Tak się składa, że potrzebowałem czegoś takiego do projektu, nad którym pracuję. Po prostu napisałem zapytanie, aby wybrać wszystkie posty typu niestandardowego, a następnie sprawdzam, jakie są rzeczywiste warunki mojej taksonomii, z której korzystają.
Potem wykorzystałem wszystkie warunki tej taksonomii,
get_terms()
a potem użyłem tylko tych, które były na obu listach, zawinąłem je w funkcję i skończyłem.Ale potem potrzebowałem więcej niż tylko identyfikatorów: potrzebowałem nazw, więc dodałem nowy argument o nazwie,
$fields
aby móc powiedzieć funkcji, co mam zwrócić. Potem pomyślałem, żeget_terms
akceptuje wiele argumentów, a moja funkcja była ograniczona do po prostu terminów używanych przez typ postu, więc dodałem jeszcze jedenif
instrukcję i proszę bardzo:Funkcja:
Stosowanie:
Jeśli potrzebujesz tylko listy terminów id:
Jeśli potrzebujesz tylko listy nazw terminów, to:
Jeśli potrzebujesz tylko listy obiektów terminowych, to:
A jeśli potrzebujesz użyć dodatkowych argumentów get_terms, takich jak: orderby, order, hierarchical ...
Cieszyć się!
Aktualizacja:
Aby naprawić liczbę haseł do konkretnej zmiany typu posta:
do:
źródło
(array) $args
zamiast listy 4 $ vars? Pozwoliłoby to nie przejmować się kolejnością dodawania argumentów, więc coś w stylu,get_terms_by_post_type( $args = array( 'taxonomies', 'args', 'post_type', 'fields' => 'all') )
a następnie wywołaj je w funkcji za pomocą$args['taxonomies']
. Pomoże ci to unikać dodawania pustych wartości i pamiętać o kolejności swoich argumentów. Sugeruję również stosowanie pojedynczych cudzysłowów zamiast podwójnych. Widziałem, jak leciały nawet pięć razy szybciej.'this is my mood: '.$value
ze"this is my mood: $value"
względu na czytelność. Jeśli chodzi o szybkość: nie jest to nieznacznie - mierzyłem do pięciu razy. A kiedy wszędzie użyjesz podwójnych cudzysłowów, szybko podsumują się, gdy otrzymasz wiele próśb. W każdym razie dobrze, że to wyjaśniłeś."
kontra'
i się myliłem. Różnica daleko wykracza poza wszystko, co ktoś by zauważył.Napisałem funkcję, która pozwala przechodzić
post_type
w$args
tablicy doget_terms()
funkcji:HT do @braydon za pisanie SQL.
źródło
Świetne pytanie i solidne odpowiedzi.
Naprawdę podobało mi się podejście @jessica z użyciem filtru terms_clauses, ponieważ rozszerza on funkcję get_terms w bardzo rozsądny sposób.
Mój kod jest kontynuacją jej pomysłu, z częścią sql z @braydon w celu zmniejszenia duplikatów. Pozwala także na tablicę typów post_typów:
Ponieważ get_terms nie ma klauzuli GROUPY BY, musiałem dodać ją na końcu klauzuli WHERE. Zauważ, że mam bardzo wysoki priorytet filtra, w nadziei, że zawsze będzie ostatni.
źródło
Nie mogłem zmusić argumentów get_terms do współpracy z powyższą wersją kodu Gavina, ale w końcu zrobiłem to, zmieniając
do
tak jak w oryginalnej funkcji Bainternet.
źródło
@Bainternet: Dzięki! Musiałem nieco zmienić funkcję, ponieważ nie działała (niektóre literówki). Jedynym problemem jest teraz to, że liczenie terminów jest wyłączone. Liczba nie bierze pod uwagę typu postu, więc nie sądzę, że można w tym celu użyć get_terms ().
EDYCJA: Dodano poprawkę (poprawki). Ale jakoś nadal nie działa dla mnie. Liczba nadal pokazuje niepoprawną wartość.
źródło
print_r(get_terms_by_post_typea(array('event','category','',array()));
ten dajeWarning: Invalid argument supplied for foreach()
do liniiforeach ($current_terms as $t){
Unikaj duplikatów:
źródło