web-dev-qa-db-ja.com

WooCommerceサブスクリプション-特定のサブスクリプションに関連する注文IDを取得します

ユーザーが持っている特定のサブスクリプションに関連するすべての注文(少なくとも注文ID)を返すwoocommerce機能はありますか?

私はこの公式ドキュメントで見つけました サブスクリプション関数とプロパティリファレンス

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

しかし、これは特定のサブスクリプション用ではないようですか?

それを実行しようとすると、致命的なエラーが発生します。

致命的なエラー:キャッチされないエラー:C:\ xampp\htdocs\mysite.com\wp-content\plugins\woocommerce-subscriptions\contains\class-wc-subscription.php:1413のオブジェクトコンテキストにないときに$ thisを使用する

私は独自のプラグインを作成しており、post status = wc-active投稿テーブルから。私は「woocommerce_order_items "、" woocommerce_order_itemmeta "および" postmeta "テーブルですが、どちらもユーザーが購入したサブスクリプションの関連注文を取得する方法を提供していません。

ユーザーが購入したサブスクリプションとそれに関連する注文の関係がどこにあるかしかわからない場合は、SQLを作成できますが、わかりません。Googleでも結果は得られません。

何か案は?

私のセットアップ:

  • phpバージョン7.0.4
  • ワードプレスバージョン4.7.3
  • woocommerce 2.6.8
  • woocommerceサブスクリプション:2.0.18
8
Ugis

更新:WooCommerceバージョン3+の互換性を追加

サブスクリプションオブジェクトから注文IDを取得するのは非常に簡単です。あなたと同じように、すべてのサブスクリプションを選択します。ここで'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'1人の顧客のサブスクリプションを取得するための配列行…このコードはテストされ、機能します

ここで最も重要なことは次のとおりです。

$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();
12
LoicTheAztec