Мне нужно получить кучу постов с их метаданными. Конечно, вы не можете получить метаданные со стандартным запросом к сообщениям, поэтому вам, как правило, приходится делать a get_post_custom()
для каждого сообщения.
Я пытаюсь с одним пользовательским запросом, как это:
$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'
");
Кажется, работает. Он срабатывает, если вы используете любое из этих мета-полей таким образом, что для одного и того же поста можно использовать несколько мета-значений. Я не могу думать о соединении, чтобы сделать это.
Итак, вопрос 1: есть ли объединение, подзапрос или что-то еще, чтобы ввести мета-поля с несколькими значениями?
Но вопрос 2: оно того стоит? Сколько postmeta
объединений таблиц я должен добавить, прежде чем подход с двумя запросами станет предпочтительным? Я мог бы собрать все данные поста в одном запросе, затем собрать все соответствующие постметы в другом и объединить мета с данными поста в одном наборе результатов в PHP. Будет ли это быстрее, чем один очень сложный запрос SQL, если это вообще возможно?
Я всегда думаю: «Дайте как можно больше работы с базой данных». Не уверен в этом!
get_posts()
, тогда get_post_meta()
для каждого из них? @MannyFleurmond, сложно найти точную информацию о встроенном кешировании WP, но AFAIK будет кешировать данные по запросу. Вызов серверу для получения этих данных является вызовом AJAX, и я не думаю, что что-то еще будет захватывать вещи до этого.