WooCommerce REST API v3 - 按修改日期过滤客户

WooCommerce REST API v3 - Filter customers by modified date

我们正在编写一个 WordPress 插件,我们在其中从 WooCommerce 网站检索 Product/Order/Customer 数据并将其存储在我们的服务器中,并定期增量更新以适应更改。我们已经为产品和订单完成了此操作。

现在,我们想要获取在特定日期之后更新其数据的客户以进行增量更新。我已经根据 尝试过如下所示。虽然它适用于产品和订单,但不适用于客户。

add_filter('woocommerce_rest_customer_query', function(array $args, \WP_REST_Request $request) {
        $modified_after = $request->get_param('modified_after');        
        if (!$modified_after) {
            return $args;
        }
        $args['date_query'][0]['column'] = 'post_modified';
        $args['date_query'][0]['after']  = $modified_after;
        return $args;
}, 10, 2);

如有任何帮助,我们将不胜感激。

在 woocommerce 中,对于产品和订单,最后修改日期存储在 posts table 的 post_modified 列中。但对于客户,它存储在 usermeta table 中,密钥为 last_update。所以你必须像这样在元数据上过滤它,

public function add_modified_after_filter_to_rest_api( $prepared_args, $request )
{
    if ($request->get_param('modified_after')) {
        $prepared_args['meta_query'] = array(
            array(
                'key'     => 'last_update',
                'value'   => (int) strtotime($request->get_param('modified_after')),
                'compare' => '>='
            ),
        );
    }
    
    return $prepared_args;
}

add_filter('woocommerce_rest_customer_query', 'add_modified_after_filter_to_rest_api', 10, 2);

对于产品和订单,您可以像这样检索, 使用 woocommerce_rest_product_object_query 过滤器。

之前的答案在我的环境中崩溃了,所以如果有人需要替代解决方案,这里是:

function add_modified_after_filter_to_rest_api( $prepared_args, $request )
{

    if ($request->get_param('modified_after')) {

        global $wpdb;
        $datetime = (int) strtotime($request->get_param('modified_after')); 
            
        $SQL = $wpdb->prepare("SELECT user_id from {$wpdb->usermeta} WHERE meta_key = 'last_update' AND meta_value >= %d", $datetime);
        $users_id = $wpdb->get_col($SQL);
            
        $prepared_args['include'] = (array) $users_id;
    
    }

    return $prepared_args;
}

add_filter('woocommerce_rest_customer_query','add_modified_after_filter_to_rest_api', 10, 2);