首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >元数据不存在或不等于WC_Order_Query的

元数据不存在或不等于WC_Order_Query的
EN

Stack Overflow用户
提问于 2021-03-19 15:09:06
回答 1查看 1.2K关注 0票数 1

我试图查询数据库中的所有订单,其中没有设置自定义post元字段,也不等于“是”。看来我无法使它正常工作。

我有这个:

代码语言:javascript
运行
复制
$query = new \WC_Order_Query([
    'date_completed' => $range,
    'x_days_follow_up_email' => 'yes' // Note: Compares '!='
]);

然后我就把这个和woocommerce_order_data_store_cpt_get_orders_query连接起来

代码语言:javascript
运行
复制
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;

这个没什么回报。如果我将比较更改为==,它将返回命令,并将元数据设置为“yes”。所以我在想,我可能会在某种程度上包括NOT EXISTS,比如:

代码语言:javascript
运行
复制
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

似乎这是可能的?不管它的价值是什么,它以前是起作用的,但在更新之后,它突然停止了工作,原因不明:

代码语言:javascript
运行
复制
$query = new \WC_Order_Query([
    'date_completed' => $range,
    'meta_key' => 'x_days_follow_up_email',
    'meta_value' => 'yes',
    'meta_compare' => '!='
]);

看起来很简单,但我似乎无法做到。

更新:

我也尝试过将它编写成一个普通的WP_Query,但是它达到了服务器的最大执行时间,并且看起来效率很低:

代码语言:javascript
运行
复制
  $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',
                )
            )
        )
    );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-19 15:17:03

更新的-您需要一些额外的代码来处理自定义元数据,如:

代码语言:javascript
运行
复制
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;
}

然后将查询更改为:

代码语言:javascript
运行
复制
$query = new \WC_Order_Query([
    'date_completed' => $range,
    'xdays_fup' => 'yes'
]);

应该管用的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66710741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档