Вопрос или проблема
Я пытаюсь выполнить следующий запрос, который возникает из того факта, что ‘дата’ и ‘время’ поста вводятся как отдельные пользовательские поля.
$args = array(
'post_type' => 'some_kind_of_posts',
'posts_per_page' => 3,
'orderby' => 'meta_value_num',
'meta_key' => strtotime('date'. ' ' .'time'),
'order' => 'DESC',
'meta_query' => array(
array(
'key' => strtotime('date'. ' ' .'time'),
'value' => strtotime(date('H:i',time() + 3600*2)),
'compare' => '<',
),
),
);
$query = new WP_Query( $args );
Другими словами, мне нужно сначала объединить ‘дату’ и ‘время’, чтобы выбрать посты, которые старше текущего времени. Последнее преобразуется в метку времени Unix (это хороший вариант?).
Я проверил в другом месте strtotime(get_field('date'). ' ' .get_field('time'))
и strtotime(date('H:i',time() + 3600*2))
, выводя их, и получил ожидаемое время Unix в секундах.
Однако сравнение по ключу-значению не удается: я не могу выбрать посты, которые старше текущего времени.
Большое спасибо за любой совет о том, как решить эту проблему.
Этот фрагмент кода должен решить вашу проблему:
function filter_where($where="") {
$where .= " AND post_date < '" . date('Y-m-d') . "'";
return $where;
}
add_filter('posts_where', 'filter_where');
$query = new WP_Query(array('posts_per_page' => 3));
remove_filter('posts_where', 'filter_where');
Вы пытаетесь сравнить объединенные дату
и время
пользовательские поля с текущим временем, чтобы отфильтровать посты, которые старше текущего времени.
Замените combined_date_time
на фактическое имя мета-ключа, где вы храните объединенные ‘дату’ и ‘время’.
Используйте current_time('timestamp')
, чтобы получить текущее время в формате метки времени Unix.
Добавьте 'type' => 'NUMERIC'
в мета-запрос, чтобы обеспечить правильное числовое сравнение.
$args = array(
'post_type' => 'some_kind_of_posts',
'posts_per_page' => 3,
'orderby' => 'meta_value_num',
'meta_key' => 'combined_date_time', // Замените 'combined_date_time' на фактическое имя мета-ключа
'order' => 'DESC',
'meta_query' => array(
array(
'key' => 'combined_date_time', // Замените 'combined_date_time' на фактическое имя мета-ключа
'value' => current_time('timestamp'), // Получите текущее время в метке времени Unix
'compare' => '<',
'type' => 'NUMERIC' // Укажите тип как числовой для правильного сравнения
),
),
);
$query = new WP_Query($args);
Ответ или решение
Чтобы получить посты, которые старше текущего Unix временного штампа, необходимо работать с пользовательскими полями, представляющими собой даты и время. В вашем случаею важно правильно объединить ‘date’ и ‘time’, а также корректно сравнить их с текущим временем.
Вот шаги, которые помогут вам решить задачу:
1. Убедитесь в правильности хранения данных
Прежде всего, убедитесь, что значения полей ‘date’ и ‘time’ хранятся в формате, который можно без проблем использовать для создания Unix временного штампа. Например:
- Поле ‘date’ должно содержать дату в формате
Y-m-d
(например,2023-10-01
). - Поле ‘time’ должно содержать время в формате
H:i
(например,14:30
).
2. Объединение даты и времени
Для сравнения с текущим временем вам нужно объединить эти два поля и преобразовать в временной штамп. Используйте strtotime()
для этого процесса. Вот пример, как это сделать в массиве аргументов:
$args = array(
'post_type' => 'some_kind_of_posts',
'posts_per_page' => 3,
'orderby' => 'meta_value_num',
'meta_key' => 'combined_date_time', // Название мета-ключа, где будет храниться объединенное значение
'order' => 'DESC',
'meta_query' => array(
array(
'key' => 'combined_date_time', // Название мета-ключа
'value' => current_time('timestamp'), // Текущий Unix временной штамп
'compare' => '<', // Сравниваем с текущим временем
'type' => 'NUMERIC' // Указываем, что сравнение числовое
),
),
);
$query = new WP_Query($args);
3. Создание мета-данных
Необходимо создать пользовательское поле, которое будет хранить объединённую дату и время. Это можно сделать с помощью функции update_post_meta()
в момент сохранения поста. Например:
$date = get_field('date');
$time = get_field('time');
$combined_timestamp = strtotime($date . ' ' . $time);
update_post_meta($post_id, 'combined_date_time', $combined_timestamp);
4. Полная реализация
Убедитесь, что мета-данные корректно обновляются и хранятся при создании или редактировании поста. Далее используйте WP_Query для извлечения постов, которые соответствуют критерию:
$args = array(
'post_type' => 'some_kind_of_posts',
'posts_per_page' => 3,
'orderby' => 'meta_value_num',
'meta_key' => 'combined_date_time',
'order' => 'DESC',
'meta_query' => array(
array(
'key' => 'combined_date_time',
'value' => current_time('timestamp'),
'compare' => '<',
'type' => 'NUMERIC'
),
),
);
$query = new WP_Query($args);
Заключение
Предложенный код и методология сравнения пользовательских полей с текущим временем помогут вам успешно фильтровать посты. Проверьте, чтобы объединённая дата и время корректно сохранялись в БД, и запустите запрос. Таким образом, вы получите посты, соответствующие вашим требованиям.
Если у вас возникнут дополнительные вопросы по коду или архитектуре баз данных, не стесняйтесь обращаться за помощью.