WooCommerce 订阅挂钩:获取订单商品

WooCommerce Subscriptions hook: Get Order Items

WooCommerce 3.0 破坏了我的应用程序,我现在不知道如何修复它。

我在此处有一个订阅 added/changed 运行 的操作:

在该函数中,我正在获取订单详细信息并查找用于可变订阅的行项目以使用该选项更新我的自定义数据库以及获取我通过 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. $subscription 对象被传递给 woocommerce_subscription_status_changed 挂钩,让我们使用它。
  2. $order->id在WC3.0中应该被$order->get_id()代替,但是我们要使用$subscription对象(订阅顺序class扩展了订购 class 所以它是相似的)。
  3. getters 必须用在循环通过 get_items() 时返回的 WC_Order_Item_Product 对象上,因此 $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 );

}