Intereting Posts
Как сохранить журнал для моего плагина Автоматическое создание пользовательских страниц для новых пользователей Внутренняя ошибка 500: активация темы rootio и развертывание с помощью capistrano Ограничение количества пользовательских сообщений, отображаемых на странице таксономии Как отобразить изображение из изображения меню в раскрывающемся меню выбора Walker случайный p-тэг в расширенных настраиваемых полях? ссылки на содержимое медиабиблиотеки на боковой панели на страницу Как показать видео из определенной категории на боковой панели? Добавить поле ко всем пользовательским типам сообщений Как редактировать сообщения / страницы без внесения изменений в реальном времени? генерация po mo переводов файлов с нуля в WordPress темы Facebook как статус обновления для wordpress Как создать WP_Query с использованием тегов mulitple и используя оператор AND или OR между ними Как я могу найти причину сбоя темы Apache в Xampplite? Ограничить пользовательский контент для конкретного пользователя

Фильтрация сообщений путем сравнения пользовательского мета значения с postdate

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

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

Я хотел бы перечислить (на странице admin, is_admin() && $query->is_main_query() ) все недопустимые ордера – те, где дата поставки или дата сбора присутствуют и находятся до даты публикации. *

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

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


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

 SELECT p.ID, p.post_date, pm.meta_value, pm.meta_key FROM wp_postmeta pm LEFT 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 <= другой meta_value


* – Это происходит, когда WooCommerce Subscriptions создает заказы на обновление, а постмета обрабатывается дословно.

Я думаю, что решение ниже будет работать,

 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'), array('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 ){ global $wpdb; $where .= " AND pm.meta_key = '_delivery_date_ymd' AND pm.meta_value != '' AND pm.meta_value < " . $wpdb->prefix ."posts.post_date"; return $where; } function the_dramatist_shop_order_query_join( $join ){ global $wpdb; $join .= ' RIGHT JOIN ' . $wpdb->prefix . 'postmeta pm ON pm.post_id = ' . $wpdb->prefix . 'posts.ID '; return $join; } // remove_filter('posts_join', 'the_dramatist_shop_order_query_join' ); // remove filter because not to effect another query to use after this query. // remove_filter('posts_where', 'the_dramatist_shop_order_filter_date' ); // remove filter because not to effect another query to use after this query. 

Я не нашел способ удалить эти фильтры после pre_get_posts запроса pre_get_posts . Лучше и лучше всего удалять эти фильтры после завершения запроса. Но и это не так необходимо, потому что мы выполняем этот запрос только по shop_order .

Надеюсь, это поможет.