У цій статті я хочу познайомити вас з 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» був підготовлений дружною командою проекту Сайтостроение від А до Я.