php - 使用 SQL 查询获取所有 WooCommerce 客户支付的订单

标签 php sql wordpress woocommerce orders

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

我很难找到它在数据库中的存储位置。我只发现 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'

最佳答案

Using "completed" order status for paid orders is correct



这是一个带有 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 …

)

Now in wp_postmeta table you will also some other meta keys related to paid orders that you could use:
'_paid_date'
'_date_paid'
'_date_completed'
'_completed_date'

But targeting "completed" order status is just fine



使用其他人列出的元键,您可以进行 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
");

测试和工作太......

关于php - 使用 SQL 查询获取所有 WooCommerce 客户支付的订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46570404/

相关文章:

javascript - 如何在 Laravel 中使用 React Router?

php - 根据产品类别替换 WooCommerce 占位符图像

sql - 忽略 CTE 中的日期列表

mysql - 通过匹配表之间的字符串创建外键

mysql - 使用来自另一个表的另一个字段的值更新表中的字段

php - 在 PHP 中使用命名空间和依赖注入(inject)的意外行为

javascript - 使用js和php更改数据库中数据的顺序

php - 使用 OOP 插件/小部件和 WP_widget 扩展将 $wpdb 放在哪里

php - WooCommerce:当客户离开然后回来时如何保留结帐信息?

css - 在某些 wordpress 页面中禁用样式表