我有自定义的元字段,delivery_date
和collection_date
在WooCommerce订单上。
实际上,我有不同的字段,具有不同格式的相同数据(Y-m-d
; U
; D d/m/Y
) 其中任何一个都可能有用。
我想列出(在管理页面;is_admin() && $query->is_main_query()
) 所有无效订单-交货日期或收款日期在postdate
.*
我不知道如何创建meta_query
如果要比较Posteta值和post值,是否需要使用posts_join
和posts_where
?
如果我没有解释清楚,我深表歉意。
<小时>edit: 以下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
类似但尚未回答的问题:
How can I create a WP_Query that returns posts where one meta_value <= another meta_value当WooCommerce订阅创建续订订单并逐字复制Posteta时,会发生这种情况。
最合适的回答,由SO网友:CodeMascot 整理而成
我认为下面的解决方案会奏效-
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
查询已完成。最好在查询完成后删除这些过滤器。但这里也没有必要,因为我们只在
shop_order
岗位类型。
希望这有帮助。