12

是否有 woocommerce 功能可以为我返回用户拥有的特定订阅的所有相关订单(至少是订单 ID)?

我在这个官方文档Subscription Function & Property Reference中找到:

WC_Subscription::get_related_orders( $return_fields, $order_type );

但这似乎不是针对特定订阅的?

每当我尝试运行它时,无论我传入什么,都会遇到致命错误:

致命错误:未捕获的错误:当不在 C:\xampp\htdocs\mysite.com\wp-content\plugins\woocommerce-subscriptions\includes\class-wc-subscription.php:1413 的对象上下文中时使用 $this

我正在制作自己的插件,并post status = wc-active从帖子表中选择所有订阅。我查看了“ woocommerce_order_items”、“ woocommerce_order_itemmeta”和“ postmeta”表,但它们都没有提供获取用户购买订阅的相关订单的方法......

如果我只知道用户购买的订阅及其相关订单的关系在哪里,那么我可以写一些 sql 但我不知道,谷歌也没有产生任何结果。

有任何想法吗?

我的设置:

  • php 版本 7.0.4
  • WordPress 版本 4.7.3
  • woocommerce 2.6.8
  • woocommerce 订阅:2.0.18
4

1 回答 1

21

更新: 添加了 WooCommerce 版本 3+ 兼容性

从订阅对象中获取订单 ID 非常容易。就像你一样,我将选择来自post 表的所有订阅。'post status' = 'wc-active'

// Get all customers subscriptions
$customer_subscriptions = get_posts( array(
    'numberposts' => -1,
    // 'meta_key'    => '_customer_user',
    // 'meta_value'  => get_current_user_id(), // Or $user_id
    'post_type'   => 'shop_subscription', // WC orders post type
    'post_status' => 'wc-active' // Only orders with status "completed"
) );

// Iterating through each post subscription object
foreach( $customer_subscriptions as $customer_subscription ){
    // The subscription ID
    $subscription_id = $customer_subscription->ID

    // IMPORTANT HERE: Get an instance of the WC_Subscription Object
    $subscription = new WC_Subscription( $subscription_id );
    // Or also you can use
    // wc_get_order( $subscription_id ); 

    // Getting the related Order ID (added WC 3+ comaptibility)
    $order_id = method_exists( $subscription, 'get_parent_id' ) ? $subscription->get_parent_id() : $subscription->order->id;

    // Getting an instance of the related WC_Order Object (added WC 3+ comaptibility)
    $order = method_exists( $subscription, 'get_parent' ) ? $subscription->get_parent() : $subscription->order;

    // Optional (uncomment below): Displaying the WC_Subscription object raw data
    // echo '<pre>';print_r($subscription);echo '</pre>';
}

您还可以在帖子查询'meta_key''meta_value'数组行中取消注释以获取一位客户的订阅...此代码经过测试并且有效

这里最重要的是:

$subscription = new WC_Subscription($customer_subscription->ID);

...因为您将获得 WC_Subscription 对象,您可以在其中应用所有 WC_Subscription 方法而不会出错,例如:

$subscription = new WC_Subscription($post_id);
$relared_orders_ids_array = $subscription->get_related_orders();
于 2017-03-15T00:19:38.680 回答