【问题标题】:Get all WooCommerce customers paid orders with a SQL query使用 SQL 查询获取所有 WooCommerce 客户支付的订单
【发布时间】:2018-03-16 04:11:08
【问题描述】:

我需要一个查询来返回所有已批准付款订单的用户。

我很难找到存储在数据库中的位置。我只找到了 post_status 'wc-complete',但我认为这不是正确的信息。

   SELECT a.post_status, b.meta_value FROM wp_posts a, wp_postmeta b
   WHERE a.ID = b.post_id 
   AND a.post_type = 'shop_order' 
   AND a.post_status = 'wc-completed'

【问题讨论】:

    标签: php sql wordpress woocommerce orders


    【解决方案1】:

    对已付款订单使用“已完成”订单状态是正确的

    这是一个带有 SQL 查询的自定义函数,它将输出一个格式化的用户 ID 数组及其已完成的订单(已付款/已接受):

    function completed_orders_ids_by_costumer_id(){
    
        global $wpdb;
    
        $query = $wpdb->get_results("
    
            SELECT pm.meta_value AS user_id, pm.post_id AS order_id
            FROM {$wpdb->prefix}postmeta AS pm
            LEFT JOIN {$wpdb->prefix}posts AS p
            ON pm.post_id = p.ID
            WHERE p.post_type = 'shop_order'
            AND p.post_status = 'wc-completed'
            AND pm.meta_key = '_customer_user'
            ORDER BY pm.meta_value ASC, pm.post_id DESC
        ");
    
        // We format the array by user ID
        foreach($query as $result)
            $results[$result->user_id][] = $result->order_id;
    
        return $results;
    }
    

    代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

    经过测试并且有效。


    示例用法 仅用于测试以查看原始输出数据

    echo '<pre>'; print_r(completed_orders_ids_by_costumer_id()); echo '</pre>';
    

    你会得到类似的东西:

    Array
    (
        [9] => Array
            (
                [0] => 505
                [0] => 497
            )
    
        [12] => Array
            (
                [0] => 626
                [1] => 584
                [2] => 483
            )
    
        [15] => Array
            (
                [0] => 614
                [1] => 598
            )
    
        [17] => Array
            (
                [0] => 634
            )
    
        … / … and so on …
    
    )
    

    现在在wp_postmeta 表中,您还可以使用一些与已付款订单 相关的其他元键
    '_paid_date'
    '_date_paid'
    '_date_completed'
    '_completed_date'

    但定位“已完成”订单状态就可以了

    使用其他人列出的元键,您可以进行 SQL 查询(可以替换我们在函数中的第一个查询)

    $query = $wpdb->get_results("
        SELECT DISTINCT pm.meta_value AS user_id, pm.post_id AS order_id
        FROM {$wpdb->prefix}postmeta AS pm
        LEFT JOIN {$wpdb->prefix}posts AS p
        ON pm.post_id = p.ID
        LEFT JOIN {$wpdb->prefix}postmeta AS pm2
        ON p.ID = pm2.post_id
        WHERE p.post_type = 'shop_order'
        AND pm.meta_key = '_customer_user'
        AND pm2.meta_key IN ( '_paid_date', '_paid_date', '_date_completed', '_completed_date' )
        AND pm2.meta_value != ''
        ORDER BY pm.meta_value ASC, pm.post_id DESC
    ");
    

    经过测试并且也可以工作......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-20
      • 2022-01-14
      • 2018-06-07
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多