У цій статті я хочу познайомити вас з 10 різними сценаріями застосування класу WP_Query і пов’язаних з ним функцій.

Згадуємо, як за допомогою WP_Query створюються цикли

Щоб виділити цю статтю серед інших частин серії «Вивчаємо WP_Query», дозвольте представити вам маленьке керівництво, присвячене створенню циклів в WordPress за допомогою класу WP_Query.

Цей процес ніяк не відрізняється від створення звичайного циклу. Типовий цикл в WordPress виглядає наступним чином:

А в разі створення циклу за допомогою класу WP_Query буде лише кілька відмінностей:

‘news’,
‘posts_per_page’ => 3
);
$my_query = new WP_Query( $args );
if ( $my_query->have_posts() ) {
while ( $my_query->have_posts() ) {
$my_query->the_post();
// Тут йдуть дані записи.
}
}
// Скидаємо дані `$post` до поточного запису з основного запиту.
wp_reset_postdata();
?>

Давайте обговоримо відмінності цих двох варіантів реалізації:

  • Ми виставляємо деякі аргументи для нашого WP_Query;
  • Ми запускаємо клас WP_Query;
  • На початок функцій have_posts() і the_post() додаємо $my_query->. Так вони стають методами класу WP_Query;
  • Потім ми скидаємо дані $post, щоб отримати дані за допомогою основного запиту.

Тепер ми знаємо, як створювати цикли за допомогою WP_Query. Давайте не будемо включати запуск циклів в кожен приклад. Але якщо у вас виникнуть проблеми з створенням циклу, то ви завжди можете повернутися до початку статті.

Приклад 1: всі записи автора за поточний рік

Припустимо, що вам необхідно вивести список записів певного автора, опублікованих у поточному році. Для цього буде достатньо комбінації з двох параметрів WP_Query:

‘john’,
// Отримуємо всі його записи за поточний рік.
‘year’ => $current_year
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
?>

Внесіть цей запит цикл, і все запрацює.

Приклад 2: отримуємо свіжі записи з категорії (за винятком поточної запису)

Вам потрібно створити цикл під кожною окремою записом, і вивести туди список свіжих записів з тієї ж категорії, але при цьому виключити з списку переглядається на даний момент запис. Це можна реалізувати за допомогою параметрів ‘cat’ і ‘post__not_in’:

term_id;
// Встановлюємо аргументи.
$args = array(
// Отримуємо записи з категорії.
‘cat’ => $current_post_first_cat_id,
// Виключаємо поточний запис.
‘post__not_in’ => array( $current_post_id )
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
?>

Що стосується самого циклу, то я б рекомендував вам зробити три або чотири колонки з мініатюрами записів вище заголовків. Такий блок рекомендацій відмінно виглядає під записами.

Приклад 3: виводимо «найпопулярніші записи», відсортовані за кількістю коментарів

В WordPress відсутня вбудована функція підрахунку переглядів запису, а спеціалізовані плагіни серйозно уповільнюють роботу сайтів. Але є й інший спосіб визначити найпопулярніші записи: підрахувати коментарі. І на відміну від кількості переглядів всі дані про коментарях вже є в базі даних.

WP_Query дозволяє без праці відсортувати записи за кількістю коментарів:

‘comment_count’
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
?>

Тепер ви можете без зусиль створити власний шаблон сторінки з циклом, який видає список популярних записів, грунтуючись на кількості коментарів.

Приклад 4: налаштування простого слайдера

Я не особливий любитель слайдерів, але людям вони подобаються, і тому я не можу відмовляти своїм клієнтам у цієї забаганки. Якщо їм потрібен слайдер, я роблю простий запит за допомогою класу WP_Query:

‘slider’,
// Отримуємо певну категорію слайдера.
‘category_name’ => ‘home-slides’,
// Виводимо всі слайди і не використовуємо пагінацію.
‘nopaging’ => true
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
?>

Аргумент ‘cat’ можна використовувати для отримання слайдів з різних категорій, і це дає можливість використовувати відразу декілька слайдерів на сторінці. Якщо ви плануєте використовувати тільки один слайдер, то можна видалити цей рядок коду.

Приклад 5: виводимо випадкову цитату в бічній панелі

Якщо вам потрібно виводити випадкову цитату в бічній панелі при кожному перегляді сторінки, то можна скористатися наступним кодом для створення типу записи, а також використовувати наступний запит для створення циклу в сайдбарі:

‘Quotes’,
‘public’ => true
);
register_post_type( ‘quotes’, $args );
}
add_action( ‘init’, ‘quote_post_type’ );
// Встановлюємо аргументи.
$args = array(
// Отримуємо тип запису «quotes».
‘post_type’ => ‘quotes’,
// Сортуємо у випадковому порядку.
‘orderby’ => ‘rand’,
// Виводимо один елемент.
‘posts_per_page’ => 1,
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
?>

Приклад 6: виводимо перелік продуктів з певної цінової категорії

Нижче наводжу фрагмент коду, який потрібно використовувати, якщо вам потрібно вивести елементи користувальницького типу запису «Product», і відфільтрувати результати за значенням настроюваного поля «price»:

‘product’,
// Встановлюємо «meta query».
‘meta_query’ => array(
array(
// Отримуємо довільне поле «price».
‘key’ => ‘price’,
// Встановлюємо ціновий діапазон.
‘value’ => array(100, 200),
// Встановлюємо оператор порівняння.
‘compare’ => ‘BETWEEN’,
// Враховуємо тільки цифрові поля.
‘type’ => ‘numeric’,
)
)
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
?>

Приклад 7: шорткод для вбудовування записів всередині записів

У цьому прикладі я хочу створити шорткод, який дозволить вбудовувати запис в іншу запис. У наведеному нижче коді ми створюємо функцію shortcode, яка дозволяє вставляти запису (або будь-який довільний тип запису), а також вказати формат: повна версія запису або фрагмент запису:

‘post’,
‘slug’ => «,
‘full’ => true
),
$attributes
)
);
// Встановлюємо аргументи.
$args = array(
// Отримуємо тип запису («post» за замовчуванням).
‘post_type’ => $type,
// Отримуємо запис за slug.
‘name’ => $slug
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
// Перевірка наявності результатів запиту.
if ( $my_query->have_posts() ) {
// Початок розмітки.
$output = «;
// початок циклу обробки даних з результатів запиту.
while ( $my_query->have_posts() ) {
$my_query->the_post();
// Додаємо заголовок висновок.
$output .= ‘

‘;
$output .= get_the_title();
$output .= ‘

‘;
// Виводимо повну версію, якщо параметр `$full` виставлений на true. Якщо ні, то виводимо фрагмент запису.
if ( ‘true’ === $full ) {
// Додаємо повну версію запису висновок.
$output .= ‘
‘;
$output .= get_the_content();
$output .= ‘
‘;
} else {
// Додаємо фрагмент запису висновок.
$output .= ‘
‘;
$output .= get_the_excerpt();
$output .= ‘… ‘ . __( ‘Переглянути повну версію’, ‘tutsplus’ ) . ‘»’;
$output .= ‘
‘;
}
}
// Завершення розмітки.
$output .= «;
} else {
// Повідомляємо вас про те, що запитувані записи не знайдені.
$output = «;
$output .= ‘

‘. __( ‘Нічого не знайдено.’, ‘tutsplus’ ) . ‘

‘;
$output .= «;
}
wp_reset_postdata();
return $output;
}
add_shortcode( ’embed_post’, ‘tutsplus_embedded_post_shortcode’ );
?>

Приклад 8: виводимо список запланованих записів (з можливістю показу фрагментів записів)

Чому б не підігріти інтерес відвідувачів з допомогою анонсу публікацій на найближчий час? Ви можете використовувати наступну функцію для виведення списку запланованих до публікації записів, а також за бажанням відобразити фрагменти записів після заголовків:

‘future’,
‘nopaging’ => true
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
// Перевірка наявності результатів запиту.
if ( $my_query->have_posts() ) {
// Початок розмітки.
$output = «;
// початок циклу обробки даних з результатів запиту.
while ( $my_query->have_posts() ) {
$my_query->the_post();
// Виводимо заголовки запланованих записів з фрагментом вмісту (якщо функція включена).
$output .= ‘
‘;
$output .= ‘

‘. get_the_title() . ‘

‘;
$output .= get_the_title();
$output .= ‘

‘;
if ( $show_excerpts ) {
$output .= ‘
‘;
$output .= get_the_excerpt();
$output .= ‘
‘;
}
$output .= ‘
‘;
}
// Кінець розмітки.
$output .= «;
} else {
// Повідомляємо користувачеві, що нічого не знайдено.
$output = «;
$output .= ‘

‘. __( ‘Нічого не знайдено’, ‘tutsplus’ ) . ‘

‘;
$output .= «;
}
wp_reset_postdata();
return $output;
}
?>

Приклад 9: запис, опублікована в цей день в минулому році

Можна створити спеціальну функцію, яка б виводила запис з сьогоднішньою датою, але тільки опубліковану рівно рік тому:

date( ‘j’ ),
// Місяць (1 — 12).
‘monthnum’ => date( ‘n’ ),
// Рік (minus 1).
‘year’ => date( ‘Y’ ) — 1,
// Показуємо тільки один запис.
‘posts_per_page’ => 1
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
?>

Приклад 10: показуємо дочірні сторінки поточного поста

Не можете запропонувати нічого іншого, крім заголовків інших сторінок у розділах «Про нас», «Послуги» або «Портфоліо»? Але краще розмістити посилання на дочірні сторінки. Можна реалізувати це у вигляді таблиці, що складається з невеликих мініатюр і заголовків під ними.

Давайте подивимося, який запит потрібно використовувати, щоб отримати необхідний шаблон сторінки:

$current_page_id,
// Відключаємо пагінацію.
‘nopaging’ => true
);
// Запускаємо новий запит.
$my_query = new WP_Query( $args );
?>

На завершення

Сподіваюся, вам сподобалися сьогоднішні приклади. Я спеціально намагався відібрати різні, щоб показати, наскільки широкі можливості класу WP_Query!

Якщо у вас є інші цікаві ідеї, то обов’язково напишіть про них у коментарях! І якщо вам сподобалася сьогоднішня стаття, обов’язково розкажіть про неї друзям!

Переклад статті «Mastering WP_Query: 10 Useful Examples» був підготовлений дружною командою проекту Сайтостроение від А до Я.