SebWeo
Цей урок є продовженням серії про роботу з запитами до бази даних WP_Query у ВордПрес. В ньому ми зосередимось на пов’язаних з запитом функціях, а згодом перейдемо і до хуків (дій, actions) та фільтрів. Це дасть вам змогу використовувати запити максимально потужно, і при потребі розширювати дефолтний функціонал.
Окрім властивостей, методів і параметрів (які ми будемо розглядати трохи згодом), при роботі з класом WP_Query ми можемо також задіювати спеціальні функції, а також додаткові хуки та фільтри. І сьогоднішній практичний урок присвячено саме цим функціям. А в подальших уроках розберемо дії та фільтри, що пов’язані з WP_Query.
Давайте детальніше розглянемо функції WordPress, що спеціально «налаштовані» під клас WP_Query. В першій частині серії ми вже дотично познайомилися з деякими з них (query_posts(), get_posts(), get_pages()), а сьогодні продовжимо і розглянемо інші важливі функції (а також умовні теги) класу.
get_query_var()Ця функція має описову назву, що промовляє сама за себе: вона бере глобальний об’єкт $wp_query і отримує з нього загальнодоступну змінну запиту. Вона має два параметри: перший — це змінна, що повертає значення, а другий — значення за замовчуванням (якщо змінна не встановлена):
<?php $page_number = get_query_var( 'paged', 1 ); $category_name = get_query_var( 'category_name' ); $taxonomy_name = get_query_var( 'taxonomy' ); ?>
get_post()Якщо розглянута раніше функція get_posts() дозволяє виконувати запит та зберігати його у вигляді масиву, то споріднена функція get_post() дозволяє отримати лише одну публікацію. Ця функція має три додаткові параметри:
object), ARRAY_A (асоціативний масив) або ж ARRAY_N (числовий масив)<?php $single_post = get_post( 1, ARRAY_A ); $post_title = $single_post['post_title']; $post_date = $single_post['post_date']; ?>
Тут потрібно дещо уточнити. Якщо ви не знаєте, що саме використовувати для отримання масиву публікацій, WP_Query чи get_posts(), то у Codex’і є наступна рекомендація: якщо вам потрібен комплексний запит (що поверне дані публікації, її метадані, дані автора та пов’язані коментарі), — тоді вам потрібен клас WP_Query, а якщо вам потрібні лише основні дані публікації — тоді використовуйте функцію get_posts(). І, відповідно, при потребі у одній публікації, — тоді вам функція get_post() в допомогу. Раніше ще була функція для отримання даних однієї сторінки, але вона вже застаріла, і натомість потрібно використовувати саме get_page()get_post().
have_posts()Ця функція просто повертає TRUE (істина), якщо у результаті запиту є хоча б одна публікація, інакше FALSE (хиба). Не приймає жодних параметрів. Приклад використання:
<?php
if ( have_posts() ) {
// TRUE
} else {
// FALSE
}
?>
the_post()Кодекс позначає цю функцію як таку, що «ітерує індекс публікації в циклі». Але вона робить кілька інших речей:
$postin_the_loop<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// ...
}
}
?>
$post: setup_postdata()Ця функція встановлює глобальні дані публікації, заповнює глобальні змінні $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages:
<?php global $post; setup_postdata( $post ); ?>
wp_reset_query()Використовуйте цю функцію, якщо ви змінювали основний запит (з допомогою функції query_posts() або хуку pre_get_posts). Приклад використання:
<?php // після того, як основний запит було змінено wp_reset_query(); ?>
$post: wp_reset_postdata()Дана функція повертає дані глобальної змінної $post до першої публікації в основному запиті. Краще застосовувати її, якщо ви використовуєте подальші після основного запити. Приклад використання:
<?php // після подальшого(ших) запитів wp_reset_postdata(); ?>
rewind_posts()Функціональність цієї функції полягає в тому, що вона просто «перемотує» (rewinds) цикл, щоб ви могли запустити його знову пізніше. Наприклад, так:
<?php // після циклу rewind_posts(); ?>
is_main_query()Цей умовний тег повертає TRUE (істина), якщо поточний запит є основним (головним), і FALSE (хиба) в іншому випадку:
<?php
if ( is_main_query() ) {
// основний запит
} else {
// другорядний(ні) запити
}
?>
in_the_loop()Подібним до попереднього тегу є умовний тег in_the_loop(), що повертає TRUE (істина), якщо ваш код виконується всередині циклу, або FALSE (хиба) в іншому випадку:
<?php
if ( in_the_loop() ) {
// наш код виконується в циклі
} else {
// наш код виконується поза циклом
}
?>
Ось і все, тема сьогоднішнього уроку вичерпана. Ви познайомились з функціями, що безпосередньо пов’язані з класом WP_Query! А далі мова піде про хуки та фільтри.
WordPress роками був неперевершеним "монолітом": він відповідав і за зручну адмін-панель, і за збереження даних,…
У світі веб-серверів часто говорять про протистояння Nginx vs Apache. Але що, якби я сказав…
Коли я починав свій шлях у веб-розробці, питання "який веб-сервер використовувати?" практично не стояло. Відповідь…
Коли мова заходить про веб-сервери, два імені завжди на слуху: Apache та Nginx. Apache —…
У світі веб-розробки ми постійно стикаємося з проблемою: "А в мене на комп'ютері все працює!".…
На зорі моєї кар'єри веб-розробника все було відносно просто: встановив локальний сервер (пам'ятаєте Denwer?), поклав…