Сьогоднішня стаття присвячена аргументів, які можна використовувати для створення як простих, так і комплексних запитів по датах. Це дозволить знаходити записи, опубліковані у визначену дату або в проміжок між конкретними датами.
Згадуємо, як працюють аргументи в WP_Query
Перед тим як почати, давайте згадаємо, як же працюють аргументи в WP_Query. Коли ви використовуєте WP_Query в темах оформлення або плагінах, доводиться включати код чотири основних елемента:
- Аргументи для запиту, в яких використовуються параметри;
- Сам запит;
- Цикл;
- Завершальний етап: скидання даних запису.
На практиці це виглядає наступним чином:
have_posts() ) {
// початок циклу обробки даних з результатів запиту
while ( $query->have_posts() ) {
$query->the_post();
// вміст опитуваної запису
}
}
// відновлення вихідних даних запису
wp_reset_postdata();
?>
Аргументи повідомляють WordPress, які дані потрібно отримувати з бази даних. Давайте зосередимо увагу на самому початку коду:
$args = array(
// Аргументи для вашого запиту
);
Як видно, аргументи укладені в масив.
Створюємо код для аргументів
Є певний спосіб ініціалізації аргументів в масиві:
$args = array(
‘parameter1’ => ‘value’,
‘parameter2’ => ‘value’,
‘parameter3’ => ‘value’
);
Слід укладати параметри та їх значення в одинарні лапки, а також використовувати => між ними. Аргументи поділяється коми. Якщо не дотримуватися цього синтаксис, то WordPress може опитати не всі наведені вами аргументи, і в результаті на екран нічого не виведеться.
Параметри дат
Ви також можете використовувати параметри для створення запитів до записів за датою публікації. Можна вписати простий набір аргументів або скористатися date_query для створення вкладених масивів і запуску більш складних запитів.
Прості аргументи дат
Для здійснення запитів по датах можна використовувати наступні параметри:
- year (int): чотиризначне вказівку року (наприклад, 2015);
- monthnum (int): номер місяця (від 1 до 12);
- w (int): тиждень року (від 0 до 53). Тут все залежить від значення «start_of_week«, яке налаштовується в панелі адміністрування;
- day (int): день місяця (від 1 до 31);
- hour (int): години (від 0 до 23);
- minute (int): хвилини (від 0 до 60);
- second (int): секунди (від 0 до 60);
- m (int): злите зазначення року і місяця (наприклад, 201502).
Уявіть, що у вас є сайт, присвячений якихось заходів, і тут для зазначення дати заходу використовується дата публікації запису. Щоб відобразити всі минулі і заплановані події за 2015 рік, потрібно буде використовувати такі аргументи:
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => array(
‘future’,
‘publish’
),
‘year’ => ‘2015’
);
В якості статусу публікацій я використовувала future та publish. Це необхідно, щоб заплановані запису за замовчуванням не враховувалися в запиті.
Якщо потрібно автоматично переглянути події, заплановані на цей рік, і не змінювати запит кожен рік, то можна спочатку запитати інформацію про поточний рік, а потім використовувати це значення в аргументах запиту:
$current_year = the_date( ‘Y’ );
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => array(
‘future’,
‘publish’
),
‘year’ => $current_year
);
Комплексні аргументи дат
Для створення складних запитів, можна скористатися параметром date_query. Він надає доступ до більшого числа параметрів:
- year (int): чотиризначне вказівку року (наприклад, 2015);
- month (int): номер місяця (від 1 до 12);
- week (int): тиждень року (від 0 до 53);
- day (int): день місяця (від 1 до 31);
- hour (int): години (від 0 до 23);
- minute (int): хвилини (від 0 до 60);
- second (int): секунди (від 0 до 60);
- after (string/array): виводимо запису після зазначеної дати;
- before (string/array): виводимо запису до зазначеної дати;
- inclusive (boolean): додаток для параметрів after/before. Обробляються, якщо значення параметра дорівнює true;
- compare (string): оператор, який можна використовувати для порівняння даних БД з вашими аргументами. Допустимі значення: ‘=’, ‘!=’, ‘>’, ‘>=’, ‘
$args = array(
‘date_query’ => array(
array(
// Тут вказуються аргументи.
)
)
);
За допомогою параметра relation також можна створювати множинні масиви і визначати, яким чином буде проводитися їх порівняння. Наведений нижче приклад виведе запити, які будуть відповідати аргументів з обох масивів:
$args = array(
‘date_query’ => array(
‘relation’ => ‘AND’,
array(
// Тут вказуються аргументи.
),
array(
// Тут вказуються аргументи.
)
)
);
Наведений нижче код отримує записи, які збігаються з аргументами в одному з масивів (або обох):
$args = array(
‘date_query’ => array(
‘relation’ => ‘OR’,
array(
// Тут вказуються аргументи.
),
array(
// Тут вказуються аргументи.
)
)
);
Давайте розглянемо все це на прикладі. Припустимо, ви працюєте над сайтом коледжу, і хочете вивести записи за поточний навчальний рік. Навчальний рік починається з 1 вересня 2015, та закінчується 31 серпня 2016, і вам потрібно знайти всі записи за цей проміжок часу:
$args = array(
‘date_query’ => array(
‘relation’ => ‘OR’,
array(
‘year’ => ‘2015’,
‘month’ => ( ‘9, 10, 11, 12’ )
),
array(
‘year’ => ‘2016’,
‘month’ => ( ‘1, 2, 3, 4, 5, 6, 7, 8’ )
)
)
);
Врахуйте, що параметр month в якості аргументів приймає рядок запиту, а не масив.
Параметри before і after
Можна визначити дати, перед або після яких потрібно відобразити записи. Робиться це за допомогою параметрів before і after. Вони приймають три аргументи:
- year (string): приймає чотири цифри року. За замовчуванням аргумент порожній;
- month (string): Місяць року (від 1 до 12). За замовчуванням 12;
- day (string): День місяця (від 1 до 31). За замовчуванням останній день місяця.
В якості дати також можна використовувати рядок запиту у форматі PHP strtotime.
Повернемося до прикладу відображення записів за поточний навчальний рік. У ньому можна використовувати вкладений масив з зазначенням параметрів року і місяці:
$args = array(
‘date_query’ => array(
‘relation’ => ‘AND’,
array(
‘after’ => array(
‘year’ => ‘2015’,
‘month’ => ‘9’
),
‘inclusive’ => true
),
array(
‘before’ => array(
‘year’ => ‘2016’,
‘month’ => ‘8’
),
‘inclusive’ => true
)
)
);
Потрібно звернути увагу на кілька моментів:
- Я використовувала ‘relation’ => ‘AND’, так як мені потрібні записи, які були опубліковані після початкової і до останньої дати;
- Для кожного з вкладених масивів я використовувала ‘inclusive’ => true, щоб упевнитися, що WordPress витягне записи, опубліковані в період між вереснем 2015 і серпнем 2016.
Такий запит також можна побудувати із зазначенням рядка запиту замість дат:
$args = array(
‘date_query’ => array(
array(
‘after’ => ‘August 31st, 2015’,
‘before’ => ‘September 1st, 2016’,
‘inclusive’ => false,
)
)
);
Із-за специфіки роботи рядків краще використовувати певні дати. Якщо ви використовуєте рядок дати, вона буде сконвертирована в 00:00 цього ж дня. Щоб все запрацювало, в рядку також доведеться вказувати час або день перед потрібною датою.
Параметри дат також дозволяють відображати записи, опубліковані сьогодні. Повертаючись до сайту-афіші, давайте припустимо, що в день запланованого заходу потрібно показати величезний банер на головній сторінці. Спочатку можна створити запит, а потім вивести дані про подію, якщо воно буде виявлено. Давайте поглянемо на потрібні аргументи:
$args = array(
‘post_type’ => ‘event’,
‘post_status’ => array(
‘future’,
‘publish’
),
‘date_query’ => array(
array(
‘year’ => date( ‘Y’ ),
‘month’ => date( ‘M’ ),
‘day’ => date( ‘D’ )
)
)
);
Функція date() повертає поточну дату. Я скористалася цією функцією тричі, щоб отримати потрібний день, місяць і рік. Я використовувала аргумент post_status для виведення заходів, які заплановані на сьогодні, але пізніше.
На завершення
Іноді потрібні запити лише до певних записів. Використовуючи клас WP_Query, ви можете створювати більш конкретні запити для виведення постів по даті, а за допомогою аргументів вказати певні умови.
Аргументи date_query комбінуються з іншими параметрами. Наприклад, з post_status, про який ми вже розповідали в нашій серії більш докладно.
Переклад статті «WP_Query Arguments: Date» був підготовлений дружною командою проекту Сайтостроение від А до Я.