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ę.
global $wpdb;
$pt = 'clients';
$mk = 'trainerid';
$mv = $pid;
$mk1 = 'email';
$mk2 = 'phone';
$mk3 = 'gender';
$mk4 = 'dob';
$mk5 = 'photo';
$mk6 = 'registrationts';
$mk7 = 'activationts';
$ord = 'p.post_name ASC';
$sql = "
SELECT p.ID, p.post_title AS fullname, pm1.meta_value AS email, pm2.meta_value AS phone, pm3.meta_value AS gender, pm4.meta_value AS dob, pm5.meta_value AS photo, pm6.meta_value AS regts, pm7.meta_value AS actemailts
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID
AND pm.meta_key = '{$mk}'
LEFT JOIN {$wpdb->postmeta} pm1 ON pm1.post_id = p.ID
AND pm1.meta_key = '{$mk1}'
LEFT JOIN {$wpdb->postmeta} pm2 ON pm2.post_id = p.ID
AND pm2.meta_key = '{$mk2}'
LEFT JOIN {$wpdb->postmeta} pm3 ON pm3.post_id = p.ID
AND pm3.meta_key = '{$mk3}'
LEFT JOIN {$wpdb->postmeta} pm4 ON pm4.post_id = p.ID
AND pm4.meta_key = '{$mk4}'
LEFT JOIN {$wpdb->postmeta} pm5 ON pm5.post_id = p.ID
AND pm5.meta_key = '{$mk5}'
LEFT JOIN {$wpdb->postmeta} pm6 ON pm6.post_id = p.ID
AND pm6.meta_key = '{$mk6}'
LEFT JOIN {$wpdb->postmeta} pm7 ON pm7.post_id = p.ID
AND pm7.meta_key = '{$mk7}'
WHERE pm.meta_value = '{$mv}'
AND p.post_type = '{$pt}'
AND p.post_status NOT IN ('draft','auto-draft')
ORDER BY {$ord}
";
$clients = $wpdb->get_results( $wpdb->prepare( $sql ), OBJECT );
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
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 )