1

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 );

}

基本上,我需要获取订阅的变体名称以存储在我的数据库中,以及我制作的自定义元字段。哪个也不再起作用

4

1 回答 1

0

这是我最好的猜测。因为我没有和你一样的设置,所以无法测试。

几点注意事项:

  1. $subscription对象被传递给钩子,woocommerce_subscription_status_changed所以让我们使用它。
  2. $order->id$order->get_id()在 WC3.0 中应该替换$subscription
  3. getter 必须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 );

}
于 2017-04-20T19:51:16.740 回答