У меня есть 3 категории с каждыми 15 сообщениями, я хочу сделать ОДИН запрос к БД, принося только 5 первых сообщений для каждой категории, как я могу это сделать?
$q = new WP_Query(array( 'post__in' => array(2,4,8), 'posts_per_page' => **FIRST_5_OF_EACH_CAT** ));
В случае, если это невозможно, что может быть более эффективным: получить все сообщения для родительской категории и просмотреть их или создать 3 разных запроса?
query-posts
Amit
источник
источник
Ответы:
То, что вы хотите, возможно, но потребует от вас углубления в SQL, которого я хотел бы избегать всякий раз, когда это возможно (не потому, что я этого не знаю, я продвинутый разработчик SQL, а потому, что в WordPress вы хотите использовать API, когда это возможно минимизировать будущие проблемы совместимости, связанные с будущими потенциальными изменениями структуры базы данных.)
SQL с
UNION
оператором - это возможностьЧтобы использовать SQL , что вам нужно , это
UNION
оператор в запросе, что - то вроде этого предполагается , что ваши слизни категории"category-1"
,"category-1"
и"category-3"
:Вы можете использовать SQL UNION с
posts_join
фильтромИспользуя вышеупомянутое, вы можете либо просто сделать вызов напрямую, либо использовать
posts_join
фильтр-ловушку, как показано ниже; Заметьте, я использую PHP heredoc, поэтому убедитесь, чтоSQL;
он слева. Также обратите внимание, что я использовал глобальную переменную, чтобы позволить вам определять категории вне ловушки, перечисляя слагов категорий в массиве. Вы можете поместить этот код в плагин или вfunctions.php
файл вашей темы :Но могут быть побочные эффекты
Конечно, использование хуков модификации запроса, как
posts_join
всегда, вызывает побочные эффекты в том смысле, что они действуют глобально на запросы, и, таким образом, вам обычно нужно обернуть ваши модификации вif
тот, который использует их только при необходимости, и какие критерии для проверки могут быть сложными.Вместо этого сосредоточиться на оптимизации?
Тем не менее, я предполагаю, что ваш вопрос касается скорее оптимизации, чем возможности выполнения топ-5 запроса по времени 3, верно? Если это так, то, возможно, есть другие варианты, которые используют API WordPress?
Лучше использовать переходный API для кэширования?
Я предполагаю, что ваши сообщения не будут меняться так часто, верно? Что если вы периодически принимаете три (3) запроса, а затем кэшируете результаты с помощью API Transients ? Вы получите поддерживаемый код и отличную производительность; это немного лучше, чем
UNION
запрос выше, потому что WordPress будет хранить списки сообщений в виде сериализованного массива в одной записиwp_options
таблицы.Вы можете взять следующий пример и перейти в корень вашего веб-сайта,
test.php
чтобы проверить это:Резюме
Хотя да, вы можете делать то, о чем просили, используя SQL-
UNION
запрос иposts_join
фильтр-хук, но вам, вероятно, лучше предложить использовать кеширование с помощью Transient API .Надеюсь это поможет?
источник
WP_Query()
не поддерживает что-то вроде First X For Each Cat . ВместоWP_Query()
вы можете использоватьget_posts()
по каждой из ваших категорий, так сказать, три раза:$posts
Теперь содержит первые пять сообщений для каждой категории.источник
Я не знаю, как получить первые пять сообщений для каждой категории в одном запросе. Если у вас когда-нибудь будет только 45 сообщений, то, пожалуй, самый эффективный подход - зайти в базу данных и получить пять сообщений для каждой категории. Попадание в базу данных три раза и объединение результатов не так уж и плохо.
источник