Хук подписок WooCommerce: Получить элементы заказа

WooCommerce 3.0 сломал мое приложение, и я не могу понять, как это исправить сейчас.

У меня есть действие, когда подписка добавляется / изменяется, работает здесь:

Внутри функции я получал детали заказа и находил позицию для переменной подписки, чтобы обновить мою пользовательскую БД с помощью опции, а также получить метаданные пользовательского заказа, которые я добавил через woocommerce_form_field:

Это больше не работает, и все выглядит защищенным? Как я могу обновить это для работы с 3.0?

add_action( 'woocommerce_subscription_status_changed', 'update_subscription', 10, 3 );
function update_subscription( $id, $old_status, $new_status ) {

$sitelink_db            = new SSLA_DB_Sitelink();
$order                  = new WC_Order( $id );
$items                  = $order->get_items();
$subscription_type  = '';
$user_id                = $order->get_user_id();
$sitelink_domain        = get_post_meta( $order->id, 'ssla_sitelink_url', true );

foreach ($items as $item) {

if( "SiteLink Subscription" === $item['name'] ) {
$subscription_type = $item['brand'];
}

}

$customer_data = array(
'user_id'               => $user_id,
'subscription_type'     => $subscription_type,
'domain_referrer'       => $sitelink_domain,
'active_subscription'   => $new_status,
'date_modified'         => date( 'Y-m-d H:i:s' ),
);

$sitelink_db->add( $customer_data );

}

По сути, мне нужно получить имя варианта подписки для хранения в моей БД, а также пользовательское метаполе, которое я создал. Который больше не работает

1

Решение

Вот мое лучшее предположение. Невозможно проверить, так как у меня нет такой же настройки, как у вас.

Несколько заметок:

  1. $subscription объект передается woocommerce_subscription_status_changed крюк, так что давайте использовать его.
  2. $order->id должен быть заменен $order->get_id() в WC3.0, но мы собираемся использовать $subscription объект (класс заказа подписки расширяет класс заказа, так что он похож).
  3. геттеры должны быть использованы на WC_Order_Item_Product объект, который возвращается при циклическом get_items() так $item['name'] становится $item->get_name()

Вот полный блок кода:

add_action( 'woocommerce_subscription_status_changed', 'update_subscription', 10, 4 );
function update_subscription( $subscription_id, $old_status, $new_status, $subscription ) {

$match_this_id = 99; // Change this to the product ID of your special subscription

$sitelink_db            = new SSLA_DB_Sitelink();

$items                  = $subscription->get_items();
$subscription_type  = '';
$user_id                = $subscription->get_user_id();
$sitelink_domain        = $subscription->get_meta( 'ssla_sitelink_url' );

foreach ($items as $item) {

if( $match_this_id === $item->get_product_id() ) {
$product = $item->get_product();
if( $product->is_type( 'variation' ) ){
$subscription_type = $product->get_attribute( 'brand' );
}
}

}

$customer_data = array(
'user_id'               => $user_id,
'subscription_type'     => $subscription_type,
'domain_referrer'       => $sitelink_domain,
'active_subscription'   => $new_status,
'date_modified'         => date( 'Y-m-d H:i:s' ),
);

$sitelink_db->add( $customer_data );

}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]