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 );
}
По сути, мне нужно получить имя варианта подписки для хранения в моей БД, а также пользовательское метаполе, которое я создал. Который больше не работает
Вот мое лучшее предположение. Невозможно проверить, так как у меня нет такой же настройки, как у вас.
Несколько заметок:
$subscription
объект передается woocommerce_subscription_status_changed
крюк, так что давайте использовать его. $order->id
должен быть заменен $order->get_id()
в WC3.0, но мы собираемся использовать $subscription
объект (класс заказа подписки расширяет класс заказа, так что он похож).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 );
}
Других решений пока нет …