Задать вопрос
@sergo573

Работа с плагином ACF. Как реализовать фильтр по диапазону дат, (половина сделана...)?

Приветствую всех, реализовываю фильтр по дате которая вводится в созданное поле (Дата) плагина ACF.
Итак, в посте есть два кастомных поля: 1) дата от; 2) дата до.
На странице архива есть календарь в котором можно выбрать диапазон дат.
Фильтруется все это дело следующим образом:
$args[ 'meta_query' ] = array(
   'relation' => 'OR',
   array(
      'key' => 'ключ поля даты от',
      'value'   => array( 'дата от выбранная на странице архив' , 'дата до выбранная на странице архив' ),
      'compare' => 'BETWEEN',
      'type'    => 'NUMERIC',
   ),
   array(
      'key' => 'ключ поля даты до',
      'value'   => array( 'дата от выбранная на странице архив' , 'дата от выбранная на странице архив' ),
      'compare' => 'BETWEEN',
      'type'    => 'NUMERIC',
   ),
);


И все бы ничего, работает если в записи ввести даты диапазон которых различается только в один день, например с 1.04 по 2.04. НО, если ввести в записи с 01.04 по 03.04, естественно при фильтрации по 02.04 ничего не найдёт...

Так вот вопрос товарищи, как правильно это реализовать?

UPD
Ладно, собрал функцию, которая в массиве даст мне нужные даты между дат:
$obshaya_data = new DatePeriod(
new DateTime(get_field('ключ поля даты от')),
new DateInterval('P1D'),
new DateTime(get_field('ключ поля даты до').' 23:59')
);
$massiv_dat = array();
foreach ($obshaya_data as $key => $value) {
	$massiv_dat[] = $value->format('Ymd');     
}


Ну и все, в ступоре теперь, как слепить это всё...
Может внутри meta_query пройтись через foreach? Такое реально вообще?...
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@sergo573 Автор вопроса
Вдруг кому пригодится... решил это таким способом:

1) создаем поле text в записи acf, в которое в дальнейшем будет записывать массив дат.
2) в function.php цепляемся к хуку сохранения записи, которое будет вызывать функцию записи массива в созданное ранее поле, используя введенные даты пользователем.
add_action( 'save_post', 'sozdaem_massiv_dat_v_zapisi' );
function sozdaem_massiv_dat_v_zapisi( $post_id ) {
$obshaya_dataaa = new DatePeriod(
new DateTime(get_field('ключ поля даты от', $post_id)),
new DateInterval('P1D'),
new DateTime(get_field('ключ поля даты до', $post_id).' 23:59')
);
$massiv_dataaa = array();
foreach ($obshaya_dataaa as $key => $value) {
	$massiv_dataaa[] = $value->format('Ymd');     
}
update_field('ключ поля куда запишем массив', $massiv_dataaa, $post_id);
}


3) Диапазон дат указанный пользователем я получаю в виде: 07.04.2023-08.04.2023
По этому, нам нужно получить массив всех дат между промежутком:
$data = explode('-', $_POST['data']);
$obshaya_data = new DatePeriod(
new DateTime($data[0]),
new DateInterval('P1D'),
new DateTime($data[1].' 23:59')
);
$massiv_dat = array();
foreach ($obshaya_data as $key => $value) {
	$massiv_dat[] = $value->format('Ymd');     
}


4) Далее пишем сам фильтр:
$meta_query = array( 'relation' => 'OR' );
foreach ($massiv_dat as $massiv_data) {
	$meta_query[] = array (
		'key' => 'ключ поля где хранится массив дат',
		'value' => $massiv_data, // Массив дат который мы получили от пользователя
		'compare' => 'LIKE',
	);
}
$args['meta_query'][] = $meta_query;


Главное работает, если кто знает лучшее решение, прошу отписаться :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
wvenator
@wvenator
Full-Stack Developer
Через date_query
Как пример:
$args = [
	'date_query' => [
		[
			'after'     => 'January 1st, 2013',
			'before'    => [
				'year'  => 2013,
				'month' => 2,
				'day'   => 28,
			],
			'inclusive' => true,
		],
	],
	'posts_per_page' => -1,
];
$query = new WP_Query( $args );
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы