Chciałbym utworzyć wp_query, które zwracałyby meta postów wewnątrz posts
tablicy.
$args = array (
'post_type' => 'page',
'meta_key' => 'someMetaKeyName',
);
// The Query
$query = new WP_Query( $args );
Zwraca coś takiego:
Jak widać posty nie zawierają żadnych metadanych, czy można również uwzględnić metadane w zwróconej tablicy?
PS Nie chcę dodatkowych wp_queries ze względu na wydajność.
wp-query
custom-field
post-meta
YemSalat
źródło
źródło
get_post_meta
na poszczególnych kluczach, 2) uruchomić,get_post_custom
aby uzyskać wszystkie posty niestandardowe pola w jednym ujęciu, lub 3) utworzyć własne zapytanie za pomocą klasy $ wpdb (get_results()
), aby zbudować własny obiekt zwrotny . (Dokumentacja klasy $ wpdb: codex.wordpress.org/Class_Reference/wpdb )Odpowiedzi:
Domyślnie
WP_Query
zwraca standardoweWP_Post
obiekty dla odpytywanych postów. Wierzę, że dzięki sprytnemu przepisaniu i zastosowaniu podanych filtrówWP_Query
możesz dodawać obiekty doWP_Post
tablicy zwróconych obiektów.Czy to będzie skuteczne? Moim zdaniem bardziej pogorszy to wydajność, ponieważ będziesz musiał dołączyć wyniki w zapytaniu, ponieważ pola niestandardowe nie są zapisywane w
wp_posts
tabeli, ale wwp_postmeta
tabeliPobieranie post meta jest bardzo szybkie i nie wymaga żadnego dodatkowego wystąpienia
WP_Query
. Możesz po prostu wywołać niestandardowe pole za pomocąget_post_meta()
. WordPress był bardzo przemyślany, gdy wprowadzono niestandardowe pola. Dodali pamięć podręczną, aby je buforować, więc bez względu na to, czy pytasz o 1 czy 100 pól niestandardowych, trafiasz do bazy danych raz, superszybko. Aby uzyskać pełny test i wyjaśnienie, zobacz ten post , który ostatnio napisałem na ten temat.Moim zdaniem dodatkowe wywołanie bazy danych i faktyczny czas są tego warte i szybsze niż przepisywanie
WP_Query
w taki sposób, aby uwzględnić niestandardowe pola w standardowym obiekcie postu zwróconym przez$posts
źródło
get_post_meta()
każdego postu. Wolę istnieć sposób na przechowywanie dodatkowych danych albo bezpośrednio wwp_posts
tabeli, albo w pokrewna tabela, która nie jest aż tak bardzo mindf * ck jakwp_postsmeta
jest.get_post_meta()
czy jako post, będziesz musiał wywoływać go w każdym poście. To samo dotyczy tagów szablonów, takich jakthe_content()
, musisz wywoływać go w każdym poście.To pytanie ma ponad rok, ale mam ten sam problem, a oto funkcja, która doda każdą wartość meta_key i meta_key do obiektu $ wp_query,
zamiast zapytania do każdej meta post w pętli while ta funkcja wykona jeden dodatkowy przykład zapytania:
„SELECT meta_key, meta_value, post_id FROM $ wpdb-> postmeta GDZIE post_id IN (1,2,3,4,5 ...)”
gdzie (1,2,3,4,5 ...) jest obecnie pytany o identyfikatory postów z $ wp_query
Dodatkowa „postmeta” zostanie zapisana do każdego $ wp_query-> postów [$ i]
$wp_query->posts[0]->postmeta
Przykład z „someMetaKeyName” nie zapomnij umieścić
add_query_meta()
do motywu funkin.phpźródło
Miałem ostatnio podobny problem, musiałem uzyskać 7 elementów metadanych z niestandardowego typu posta, ale potrzebowałem też posta opartego na metadanych.
Utworzyłem więc następującą instrukcję SQL, używam jej często. Mam nadzieję, że pomoże to komuś innemu. Spróbuję to wyjaśnić najlepiej, jak potrafię.
Najpierw dostaję funkcje bazy danych wordpress z globalnym $ wpdb. Następnie ustawiam typ postu za pomocą $ pt. Aby uzyskać poprawny post, który pasuje do określonej wartości w post_meta, ustawiłem $ mk (meta_key)
Następnie ustawiam zmienną $ mv (meta_value). (w tym przypadku wartość meta odpowiada postidowi)
$ mk1- $ mk7 to meta_keys, które chcę od każdego postu. (Wezmę wartości w instrukcji select)
Wykonuję również „sortuj według” var, ustawiając $ ord
Instrukcja select wygląda następująco: wybieram identyfikator posta i post_title z POST lub „p”.
Następnie wybieram wszystkie metadane, których potrzebuję, wybierając je za pomocą pm1. -> pm.7 i pobieranie meta_value i zmiana ich nazwy (AS), aby było bardziej czytelne podczas pobierania danych z mojego obiektu.
Tworzę LEFT JOIN dla metadanych, które muszę dopasować do posta. (po południu)
Tworzę 7 lewych złączeń dla każdego z metadanych, które muszę pobrać. (pm1-pm7)
Instrukcja WHERE oparta jest na pierwszym LEWYM DOŁĄCZU (pm), aby wiedzieć, że potrzebuję tylko wpisów, w których pasują metadane.
Dodam również „AND” dla typu posta i dla post_statuses, które nie są wersjami roboczymi. (więc tylko opublikowane posty)
Na koniec dodaję klauzulę „sortuj według”.
Działa to szybko i dzięki wbudowanym indeksom w Wordpress, więc wydaje się wydajne.
Nie wiem, czy coś jest lepsze od tego, ale jeśli tak, chciałbym tego użyć.
Mam nadzieję że to pomoże.
Marcus
źródło
Hej, spróbuj tego, myślę, że działa dobrze.
źródło
meta_key
imeta_query[]['key']
jak dobrze?meta_key
i / lubmeta_query
nie modyfikuj typu zwracanych wyników, tylko samo zapytanie.