Подписки на WooCommerce - Получить идентификаторы связанных заказов для определенной подписки


Есть ли функция woocommerce, которая вернет мне все связанные заказы (по крайней мере, идентификатор заказа) для конкретной подписки, которую имеет пользователь?

Я нашел в этой официальной документации Ссылку на функцию подписки и свойства:

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

Я создаю свой собственный плагин и выбираю все подписки, где post status = wc-active, из таблицы post. Я заглянул в "woocommerce_order_items", "woocommerce_order_itemmeta" и таблицы "postmeta", но ни одна из них не предоставляет способа получения связанных заказов для подписки, купленной пользователем...

Если бы я только знал, где находятся отношения для купленных пользователем подписок и связанных с ними заказы, тогда я мог бы написать немного sql, но я понятия не имею, и Google тоже не дает никаких результатов.

Есть идеи?

Мои настройки:

  • версия php 7.0.4
  • версия wordpress 4.7.3
  • woocommerce 2.6.8
  • подписки на woocommerce: 2.0.18
Author: LoicTheAztec, 2017-03-14

1 answers

Обновлено: Добавлена совместимость с WooCommerce версии 3+

Очень легко получить идентификатор заказа из объекта подписки. Я собираюсь выбрать, как и вы, все подписки, где '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>';
}

Вы также можете раскомментировать в запросе post строки массива '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();
 8
Author: LoicTheAztec, 2017-10-12 16:19:49