Мені потрібно отримати купу публікацій з їх метаданими. Звичайно, ви не можете отримати метадані зі стандартним запитом повідомлень, тому зазвичай потрібно робити 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
приєднань таблиці я додати до того, як підхід із 2 запитами стане кращим? Я міг схопити всі дані публікації в одному запиті, потім захопити всі відповідні постмета в іншому і поєднати мета з даними публікації в одному наборі результатів в PHP. Чи буде це в кінцевому підсумку швидше, ніж один, все складніший SQL-запит, якщо це можливо?
Я завжди думаю: "Надайте якомога більше роботи над базою даних". Не впевнений у цьому!
get_posts()
, то get_post_meta()
для кожного з них? @MannyFleurmond, важко знайти важку інформацію про вбудований кеш-пам'ять WP, але AFAIK він кешуватиме дані за запит. Заклик до сервера захопити ці дані - це дзвінок AJAX, і я не думаю, що ще щось захопить його.