Сьогоднішня стаття присвячена аргументів, які можна використовувати для створення як простих, так і комплексних запитів по датах. Це дозволить знаходити записи, опубліковані у визначену дату або в проміжок між конкретними датами.

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

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here