WooCommerce订阅钩子:获取订单项目

时间:2017-04-20 17:29:27

标签: php wordpress woocommerce orders woocommerce-subscriptions

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 个答案:

答案 0 :(得分:0)

这是我最好的猜测。这是不可能测试的,因为我没有和你一样的设置。

很少注意到:

  1. $subscription对象传递给woocommerce_subscription_status_changed挂钩,让我们使用它。
  2. $order->id应该替换为WC3.0中的$order->get_id(),但我们将使用$subscription对象(订阅类扩展了订单类,因此它类似)
  3. 必须在循环WC_Order_Item_Product时返回的get_items()对象上使用getter,以便$item['name']成为$item->get_name()
  4. 这是完整的代码块:

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