#php #mysql #wordpress
Вопрос:
Я разрабатываю домашнюю страницу своего нового веб-сайта и хочу отобразить смесь новых сообщений из нескольких ТИПОВ СООБЩЕНИЙ. Я создал короткие коды, каждый из которых инициирует отдельные WP_Query
вызовы и возвращает соответствующие данные, но я чувствую, что было бы гораздо эффективнее сделать все это за один WP_Query
звонок на главной странице.
Я знаю, что могу звонить нескольким типам сообщений с:
WP_Query(array('post_type' => array('type1', 'type2', 'type3')))
И я знаю, что могу установить ограничение на количество сообщений, полученных с помощью
WP_Query(array('post_type' => array('type1', 'type2', 'type3'),
'posts_per_page' => '30') )
Но в идеале я хотел бы получить запрос, в котором говорилось бы:.. дайте мне 4 из них, 3 из них и полдюжины из них!
У кого-нибудь есть какие-нибудь идеи?
Редактировать:
После небольшой обратной связи выясняется, что это может оказаться невозможным. Если это так, то я беспокоюсь по пустякам? Я думал, что при выполнении нескольких запросов WP_Query могут возникнуть проблемы с производительностью.
Комментарии:
1. Итак, если я прав, вы хотите вызвать, скажем, 3 пользовательских типа сообщений и ограничить возвращаемую запись каждого типа post_type отдельно, но одним wp_query?
2. Да, это совершенно верно!
3. Я не могу придумать, как вы можете сделать это с помощью одного wp_query, я почти уверен, что это невозможно
Ответ №1:
Во-первых, не было бы никаких накладных расходов при выполнении 3 простых запросов на странице. Сам WordPress выполняет множество запросов на каждую страницу. Существует множество других узких мест, которые могут привести к потере производительности и о которых вам следует позаботиться.
Под капотом WP_Query в основном создаст запрос MySQL, поэтому он:
«ВЫБЕРИТЕ что-то, ГДЕ выполняются некоторые условия, УПОРЯДОЧЬТЕ редактирование ПО какому-либо полю, а затем ОГРАНИЧЬТЕ редактирование N результатами».
Поэтому, если вы не можете дать определенный порядок своим постам, вы просто не сможете получить то, что хотите…
В любом случае, если вы все еще хотите сделать это только с одним запросом, у вас все еще есть пара шансов.
- Вы можете делать запросы по идентификаторам.
Вы должны каким-то образом вручную установить свои идентификаторы, но вы можете получать сообщения в том порядке, который вы предпочитаете:
WP_Query(['post__in' => [5,4,10,9], 'orderby' => 'post__in', 'posts_per_page' => 4]);
- Используйте перекрестную таксономию или пользовательские мета
Вы можете прикрепить «общий элемент» к трем вашим пользовательским типам записей (таксономия или мета), а затем запросить его. Вы можете достичь этого многими способами. Я думаю, что более простой способ-использовать встроенную таксономию «тегов» :
- Убедитесь , что «post_tag» назначен вашему CPT.
Если вы создаете свой собственный CPTregister_post_type()
, просто добавьте это:
'taxonomies' => array('post_tag')
ИЛИ добавьте это в свой functions.php
add_action( 'init', 'add_post_tag_to_my_custom_cpt', 10, 0 );
function 'add_post_tag_to_my_custom_cpt() {
register_taxonomy_for_object_type( 'post_tag', 'type_1' );
register_taxonomy_for_object_type( 'post_tag', 'type_2' );
register_taxonomy_for_object_type( 'post_tag', 'type_3' );
};
- Назначьте общий «термин тега», например «избранное», вашим любимым публикациям
- Используйте WP_Query с
tag
параметром
$posts = new WP_Query( array( 'tag' => 'featured' ) );