Поддержка Проблемы и решения Вывод постов старше текущей даты (за текущий месяц)

  • Есть сайт на wp. Сайт посвящен фильмам.
    Соответственно есть кастомный тип поста «Фильмы». У этого кастомного типа есть произвольное поле «дата выхода».
    Требуется выводить на главной фильмы, которые скоро выйдут.
    С этим большая проблема, так как нам нужно сделать выборку постов с такими параметрами:
    Тип поста — «фильмы» (тут все просто)
    Количество записей — 5 (тут тоже все понятно)
    Произвольное поле «дата выхода» — старше текущей даты, но не больше, чем на месяц! Как задать такое условие — мне совершенно непонятно, так как, если выбирать просто фильмы по самым «старшим» датам выхода — там могут быть только те, которые выйдут в следующем году/десятилетии, а нужно за текущий месяц.
    База большая — 30 тысяч фильмов.
    Это можно как-то организовать? И, если можно, то как?

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Произвольное поле «дата выхода» — старше текущей даты, но не больше, чем на месяц! Как задать такое условие — мне совершенно непонятно,

    https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters

    ‘meta_query’ => array(
    ‘relation’ => ‘AND’
    ну и дальше по тексту.
    Только желательно, чтобы дата была в формате mysql, чтобы однозначно определялась.

    Другой вариант — совсем вручную. Сначала выбрать из postmeta все post_id, у которых meta_value попадает в заданный диапазон, а затем в wp_query запросить посты с этими IDами.

    p.s. только не говорите «я не программист» 😉

    Спасибо! Но теперь еще одна проблема. У всех метаполей (я создавал их через плагин) формат string. Можно ли как то преобразовать их в datetime?

    meta_query also contains one or more arrays with the following keys:

    key (string) – Custom field key.
    value (string|array) – Custom field value. It can be an array only when compare is ‘IN’, ‘NOT IN’, ‘BETWEEN’, or ‘NOT BETWEEN’. You don’t have to specify a value when using the ‘EXISTS’ or ‘NOT EXISTS’ comparisons in WordPress 3.9 and up.
    (Note: Due to bug #23268, value is required for NOT EXISTS comparisons to work correctly prior to 3.9. You must supply some string for the value parameter. An empty string or NULL will NOT work. However, any other string will do the trick and will NOT show up in your SQL when using NOT EXISTS. Need inspiration? How about ‘bug #23268’.)
    compare (string) – Operator to test. Possible values are ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<‘, ‘<=’, ‘LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’, ‘NOT BETWEEN’, ‘EXISTS’ and ‘NOT EXISTS’. Default value is ‘=’.
    type (string) – Custom field type. Possible values are ‘NUMERIC’, ‘BINARY’, ‘CHAR’, ‘DATE’, ‘DATETIME’, ‘DECIMAL’, ‘SIGNED’, ‘TIME’, ‘UNSIGNED’. Default value is ‘CHAR’.

    p.s. матаданные у WP всегда хранятся как строки

    p.p.s. преобразования типов данных в mysql — довольно нагрузочная операция.

    p.p.p.s. если бы я делал базу на стопиццот тысяч записей, где для каждой нужна была бы дата, я бы или альтерил таблицу posts, или делал радом еще одну таблицу о двух полях. либо исхитрился бы использовать штатные поля дат у записей. но custom fields использовал бы в самую последнюю очередь.

    Понял, спасибо. Все это, к сожалению, не очень изящно…
    WP накладывает печальные ограничения!

    • Ответ изменён 2 года, 6 месяцев назад пользователем viktor92.

    WP накладывает печальные ограничения!

    По custom fields? Есть такое дело. Просто создавать, просто выводить, но тяжко использовать в качестве фильтров.

    Однако альтернативная схема «вширь», используемая в других движках, имеет свои недостатки: alter table на миллионнике может запросто завалить сервер.

    Все это, к сожалению, не очень изящно…

    Тем не менее для обработки больших объёмов данных в доп. полях вполне себе решение (я имею ввиду варианты, предложенные Юрием).

    Можете посмотреть ещё старенький доклад Константина: https://wordpress.tv/2013/08/19/konstantin-kovshenin-wordpress-site-speed/ Где-то с 19й мин он рассказывает как раз про методы работы с базой при больших объёмах данных.

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Тема «Вывод постов старше текущей даты (за текущий месяц)» закрыта для новых ответов.