WC_Order_Query 其中元数据不存在或不等于
WC_Order_Query where meta data does not exist or is not equal to
我正在尝试从数据库中查询所有未设置自定义 post 元字段或不等于 'yes' 的订单。看来我无法让它正常工作。
我有这个:
$query = new \WC_Order_Query([
'date_completed' => $range,
'x_days_follow_up_email' => 'yes' // Note: Compares '!='
]);
然后我将其连接到 woocommerce_order_data_store_cpt_get_orders_query
:
if (!empty($query_vars['x_days_follow_up_email'])) {
$query['meta_query'][] = [
'key' => 'x_days_follow_up_email',
'value' => esc_attr($query_vars['x_days_follow_up_email']),
'compare' => '!='
]
];
}
return $query;
这个returns没什么。如果我将比较更改为 ==
,它 returns 元设置为 'yes' 的订单。所以我在想我可能不得不以某种方式包括 NOT EXISTS
,像这样:
if (!empty($query_vars['x_days_follow_up_email'])) {
$query['meta_query'][] = [
'relation' => 'OR',
[
'key' => 'x_days_follow_up_email',
'value' => esc_attr($query_vars['x_days_follow_up_email']),
'compare' => '!='
],
[
'key' => 'x_days_follow_up_email',
'compare' => 'NOT EXISTS'
]
];
}
return $query;
遗憾的是,这也不起作用。我可以为此编写自己的 WP_Query,但是有很多订单,而且我发现查询需要很长时间。我代码中的 $range
基本上是 11 - 8 天前的所有订单。我只想要没有元 x_days_follow_up_email
的订单,或者设置了元但不设置为 yes
.
的订单
好像应该可以吧?就其价值而言,这之前是有效的,但由于未知原因更新后突然停止工作:
$query = new \WC_Order_Query([
'date_completed' => $range,
'meta_key' => 'x_days_follow_up_email',
'meta_value' => 'yes',
'meta_compare' => '!='
]);
看起来很简单,但我似乎做不到。
更新:
我也试过把它编码成正常的WP_Query,但是它达到了服务器的最大执行时间并且看起来效率很低:
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-completed',
'posts_per_page' => -1,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => '_date_completed',
'value' => array($rangeStart, $rangeEnd),
'compare' => 'BETWEEN',
'type' => 'NUMBER'
),
array(
'relation' => 'OR',
array(
'key' => 'x_days_follow_up_email',
'value' => 'yes',
'compare' => '!=',
),
array(
'key' => 'x_days_follow_up_email',
'compare' => 'NOT EXISTS',
)
)
)
);
已更新 - 您需要一些额外的代码来处理自定义元数据,例如:
add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', 'order_data_store_custom_query_var', 10, 2 );
function order_data_store_custom_query_var( $query, $query_vars ) {
if ( ! empty( $query_vars['xdays_fup'] ) ) {
$query['meta_query'][] = array(
'relation' => 'OR',
array(
'key' => 'x_days_follow_up_email',
'value' => esc_attr( $query_vars['xdays_fup'] ),
'compare' => '!=',
),
array(
'key' => 'x_days_follow_up_email',
'compare' => 'NOT EXISTS',
)
);
}
return $query;
}
然后您将查询更改为:
$query = new \WC_Order_Query([
'date_completed' => $range,
'xdays_fup' => 'yes'
]);
应该可以。
我正在尝试从数据库中查询所有未设置自定义 post 元字段或不等于 'yes' 的订单。看来我无法让它正常工作。
我有这个:
$query = new \WC_Order_Query([
'date_completed' => $range,
'x_days_follow_up_email' => 'yes' // Note: Compares '!='
]);
然后我将其连接到 woocommerce_order_data_store_cpt_get_orders_query
:
if (!empty($query_vars['x_days_follow_up_email'])) {
$query['meta_query'][] = [
'key' => 'x_days_follow_up_email',
'value' => esc_attr($query_vars['x_days_follow_up_email']),
'compare' => '!='
]
];
}
return $query;
这个returns没什么。如果我将比较更改为 ==
,它 returns 元设置为 'yes' 的订单。所以我在想我可能不得不以某种方式包括 NOT EXISTS
,像这样:
if (!empty($query_vars['x_days_follow_up_email'])) {
$query['meta_query'][] = [
'relation' => 'OR',
[
'key' => 'x_days_follow_up_email',
'value' => esc_attr($query_vars['x_days_follow_up_email']),
'compare' => '!='
],
[
'key' => 'x_days_follow_up_email',
'compare' => 'NOT EXISTS'
]
];
}
return $query;
遗憾的是,这也不起作用。我可以为此编写自己的 WP_Query,但是有很多订单,而且我发现查询需要很长时间。我代码中的 $range
基本上是 11 - 8 天前的所有订单。我只想要没有元 x_days_follow_up_email
的订单,或者设置了元但不设置为 yes
.
好像应该可以吧?就其价值而言,这之前是有效的,但由于未知原因更新后突然停止工作:
$query = new \WC_Order_Query([
'date_completed' => $range,
'meta_key' => 'x_days_follow_up_email',
'meta_value' => 'yes',
'meta_compare' => '!='
]);
看起来很简单,但我似乎做不到。
更新:
我也试过把它编码成正常的WP_Query,但是它达到了服务器的最大执行时间并且看起来效率很低:
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-completed',
'posts_per_page' => -1,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => '_date_completed',
'value' => array($rangeStart, $rangeEnd),
'compare' => 'BETWEEN',
'type' => 'NUMBER'
),
array(
'relation' => 'OR',
array(
'key' => 'x_days_follow_up_email',
'value' => 'yes',
'compare' => '!=',
),
array(
'key' => 'x_days_follow_up_email',
'compare' => 'NOT EXISTS',
)
)
)
);
已更新 - 您需要一些额外的代码来处理自定义元数据,例如:
add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', 'order_data_store_custom_query_var', 10, 2 );
function order_data_store_custom_query_var( $query, $query_vars ) {
if ( ! empty( $query_vars['xdays_fup'] ) ) {
$query['meta_query'][] = array(
'relation' => 'OR',
array(
'key' => 'x_days_follow_up_email',
'value' => esc_attr( $query_vars['xdays_fup'] ),
'compare' => '!=',
),
array(
'key' => 'x_days_follow_up_email',
'compare' => 'NOT EXISTS',
)
);
}
return $query;
}
然后您将查询更改为:
$query = new \WC_Order_Query([
'date_completed' => $range,
'xdays_fup' => 'yes'
]);
应该可以。