WP_Query: рецепты запросов
WP_Query: рецепты запросов
Заголовок раздела «WP_Query: рецепты запросов»WP_Query — основной класс для выборки записей в WordPress.
Всегда сбрасывайте запрос через wp_reset_postdata() после кастомного цикла.
Базовый шаблон цикла
Заголовок раздела «Базовый шаблон цикла»$query = new WP_Query( [ /* аргументы */ ] );
if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // the_title(), the_content(), get_the_ID() ... } wp_reset_postdata();}1. Записи из категории с пагинацией
Заголовок раздела «1. Записи из категории с пагинацией»$paged = get_query_var( 'paged' ) ?: 1;
$query = new WP_Query( [ 'cat' => 5, // ID категории 'posts_per_page' => 10, 'paged' => $paged, 'orderby' => 'date', 'order' => 'DESC',] );Вывод пагинации:
echo paginate_links( [ 'total' => $query->max_num_pages, 'current' => $paged,] );2. Записи по тегу (slug)
Заголовок раздела «2. Записи по тегу (slug)»$query = new WP_Query( [ 'tag' => 'wordpress', 'posts_per_page' => 6,] );3. Кастомный тип записи (CPT)
Заголовок раздела «3. Кастомный тип записи (CPT)»$query = new WP_Query( [ 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => -1, // все записи 'orderby' => 'title', 'order' => 'ASC',] );4. Запрос по мета-полю
Заголовок раздела «4. Запрос по мета-полю»$query = new WP_Query( [ 'post_type' => 'post', 'meta_query' => [ [ 'key' => 'featured', 'value' => '1', 'compare' => '=', ], ],] );Диапазон числовых значений
Заголовок раздела «Диапазон числовых значений»$query = new WP_Query( [ 'post_type' => 'product', 'meta_query' => [ [ 'key' => 'price', 'value' => [ 100, 500 ], 'compare' => 'BETWEEN', 'type' => 'NUMERIC', ], ],] );5. Несколько категорий (OR / AND)
Заголовок раздела «5. Несколько категорий (OR / AND)»// Записи из категории 3 ИЛИ 7$query = new WP_Query( [ 'category__in' => [ 3, 7 ], 'posts_per_page' => 10,] );
// Записи, которые принадлежат категориям 3 И 7 одновременно$query = new WP_Query( [ 'category__and' => [ 3, 7 ], 'posts_per_page' => 10,] );6. Записи за последние N дней
Заголовок раздела «6. Записи за последние N дней»$query = new WP_Query( [ 'date_query' => [ [ 'after' => '30 days ago', 'inclusive' => true, ], ], 'posts_per_page' => 10,] );7. Исключить текущую запись (например, в блоке «Похожие»)
Заголовок раздела «7. Исключить текущую запись (например, в блоке «Похожие»)»$query = new WP_Query( [ 'post_type' => get_post_type(), 'posts_per_page' => 4, 'post__not_in' => [ get_the_ID() ], 'orderby' => 'rand',] );8. Поиск по заголовку (LIKE)
Заголовок раздела «8. Поиск по заголовку (LIKE)»$query = new WP_Query( [ 'post_type' => 'post', 'title_filter'=> 'WordPress', // Не нативный параметр — нужен фильтр ниже] );
// Фильтр для поддержки title_filteradd_filter( 'posts_where', function ( string $where, WP_Query $q ): string { $title = $q->get( 'title_filter' ); if ( $title ) { global $wpdb; $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $title ) ) . '%\''; } return $where;}, 10, 2 );9. Сортировка по мета-полю (числовому)
Заголовок раздела «9. Сортировка по мета-полю (числовому)»$query = new WP_Query( [ 'post_type' => 'product', 'meta_key' => 'price', 'orderby' => 'meta_value_num', 'order' => 'ASC', 'meta_query' => [ [ 'key' => 'price', 'type' => 'NUMERIC', ], ],] );10. get_posts() — быстрая альтернатива для простых выборок
Заголовок раздела «10. get_posts() — быстрая альтернатива для простых выборок»$posts = get_posts( [ 'numberposts' => 5, 'category' => 3, 'orderby' => 'date', 'order' => 'DESC',] );
foreach ( $posts as $post ) { setup_postdata( $post ); the_title();}wp_reset_postdata();
get_posts()не запускает основной цикл и не поддерживает пагинацию. Подходит для виджетов и шорткодов.