Фильтруйте сообщения, сравнивая пользовательское мета-значение с пост-датой

У меня есть пользовательские мета-поля, delivery_date и collection_date в заказах WooCommerce.

На самом деле у меня есть разные поля с одинаковыми данными в разных форматах ( Ymd ; U ; D d /m /Y ) любого из это может быть полезно.

Я хотел бы перечислить (на странице администратора; is_admin () & amp; $ query- & gt; is_main_query () ) все недействительные заказы - те, в которых указана дата доставки или дата сбора и до postdate . *

Я не вижу, как создать meta_query , которые сравнивают значение postmeta со значением post, нужно ли мне использовать posts_join и posts_where ?

извинения, если Я не очень хорошо объяснил это.


edit : следующий запрос MySQL выбирает правильные сообщения:

SELECT p.ID, p.post_date, pm.meta_value, pm.meta_keyFROM wp_postmeta pmLEFT JOIN wp_posts p ON pm.post_id = p.ID WHERE pm.meta_key = '_delivery_date_ymd'AND pm.meta_value != ''AND pm.meta_value < p.post_date

Похожий , но без ответа вопрос: Как создать WP_Query, который возвращает сообщения, в которых одно meta_value & lt; = еще одно meta_value

< hr />

* - это происходит, когда подписки WooCommerce создают заказы на обновление, а постмета копируется дословно.

Ответы и комментарии:

Вам это нужно для всех типов сообщений или только для типа сообщений shop_order?
Создан 22-12-2016 09:02 CodeMascot

only shop_order (и только когда я установил флажок, я добавил к фильтрам)
Создан 22-12-2016 09:17 jezmck

Флажок ??? Я понял эту часть флажка. И вы не упомянули об этом в своем вопросе.
Создан 22-12-2016 09:52 CodeMascot

Часть с флажками на самом деле не актуальна, я упоминаю об этом только сейчас, чтобы люди знали, что это не постоянная фильтрация.
Создан 22-12-2016 09:50 jezmck

Я думаю, что приведенное ниже решение будет работать
add_action ('pre_get_posts', 'the_dramatist_filter_shop_order');
function the_dramatist_filter_shop_order ($ query) {

    if (is_admin () && $ query-> is_main_query () && in_array ($ query-> get ('post_type')), массив ('shop_order'))) {
        add_filter ('posts_join', 'the_dramatist_shop_order_query_join');
        add_filter ('posts_where', 'the_dramatist_shop_order_filter_date');
    }
}

function the_dramatist_shop_order_filter_date ($ where) {
    глобальный $ wpdb;
    $ where. = "AND pm.meta_key = '_delivery_date_ymd' AND pm.meta_value! = '' AND pm.meta_value <". $ wpdb-> prefix. "posts.post_date";
    вернуть $ где;
}

function the_dramatist_shop_order_query_join ($ join) {
    глобальный $ wpdb;
    $ join. = 'RIGHT JOIN'. Префикс $ wpdb->. 'postmeta pm ON pm.post_id ='. Префикс $ wpdb->. 'posts.ID';
    вернуть $ join;
}

// remove_filter ('posts_join', 'the_dramatist_shop_order_query_join'); // удалить фильтр, потому что он не влияет на другой запрос для использования после этого запроса.
// remove_filter ('posts_where', 'the_dramatist_shop_order_filter_date'); // удалить фильтр, потому что он не влияет на другой запрос для использования после этого запроса.

Я не нашел способа удалить эти фильтры после завершения запроса pre_get_posts. Лучше и лучше удалить эти фильтры после завершения запроса. Но и здесь это не так необходимо, потому что мы выполняем этот запрос только по типу поста shop_order.
Надеюсь, это поможет.
Создан 22-12-2016 09:51 CodeMascot3,6872619