Muszę zdobyć kilka postów z ich metadanymi. Oczywiście nie można uzyskać metadanych za pomocą standardowego zapytania do postów, więc na ogół musisz zrobić get_post_custom()
dla każdego postu.
Próbuję z jednym niestandardowym zapytaniem, takim jak to:
$results = $wpdb->get_results("
SELECT p.ID,
p.post_title,
pm1.meta_value AS first_field,
pm2.meta_value AS second_field,
pm3.meta_value AS third_field
FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm1 ON (
pm1.post_id = p.ID AND
pm1.meta_key = 'first_field_key'
) LEFT JOIN $wpdb->postmeta pm2 ON (
pm2.post_id = p.ID AND
pm2.meta_key = 'second_field_key'
) LEFT JOIN $wpdb->postmeta pm3 ON (
pm3.post_id = p.ID AND
pm3.meta_key = 'third_field_key'
)
WHERE post_status = 'publish'
");
Wydaje się działać. Występuje, jeśli użyjesz któregokolwiek z tych pól meta w sposób, który pozwala na wiele meta wartości dla tego samego postu. Nie mogę wymyślić takiego połączenia.
Pytanie 1: Czy istnieje sprzężenie, zapytanie cząstkowe lub cokolwiek innego, aby wprowadzić pola meta o wielu wartościach?
Ale pytanie 2: czy warto? Ile postmeta
sprzężeń tabel dodam, zanim podejście z dwoma zapytaniami stanie się preferowane? Mogłem pobrać wszystkie dane posta w jednym zapytaniu, a następnie pobrać odpowiednią postmetę w innym i połączyć meta z danymi postu w jednym zestawie wyników w PHP. Czy skończyłoby się to szybciej niż pojedyncze, coraz bardziej złożone zapytanie SQL, jeśli to w ogóle możliwe?
Zawsze myślę: „Daj bazę danych jak najwięcej pracy”. Nie jestem pewien w tej sprawie!
get_posts()
, to get_post_meta()
dla każdego z nich? @MannyFleurmond, trudno jest znaleźć twarde informacje na temat wbudowanego buforowania WP, ale AFAIK będzie buforować rzeczy na żądanie. Wezwanie do serwera, aby pobrać te dane, jest wywołaniem AJAX i nie sądzę, aby cokolwiek innego mogło przechwycić coś przed tym.