Выбор постов, старше текущей метки времени Unix эпохи

Вопрос или проблема

Я пытаюсь выполнить следующий запрос, который возникает из того факта, что ‘дата’ и ‘время’ поста вводятся как отдельные пользовательские поля.

$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);

Заключение

Предложенный код и методология сравнения пользовательских полей с текущим временем помогут вам успешно фильтровать посты. Проверьте, чтобы объединённая дата и время корректно сохранялись в БД, и запустите запрос. Таким образом, вы получите посты, соответствующие вашим требованиям.

Если у вас возникнут дополнительные вопросы по коду или архитектуре баз данных, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...