2017-04-20 133 views
1

WooCommerce 3.0打破了我的應用程序,我無法弄清楚現在如何解決它。WooCommerce訂閱掛鉤:獲取訂單項目

我在添加訂閱的動作/改變運行位置:

在函數內部我得到訂單的詳細信息,並找到行項目的訂閱變量來更新我的自定義數據庫與選項,以及獲得自定義訂單元,我通過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); 

} 

基本上我需要獲取訂閱的變體名稱以存儲在我的數據庫中,以及我製作的自定義元字段。哪些不工作了

+0

的陣列應該是回到兼容,但現在'get_items()'返回一個'WC_Order_Item'對象的數組,所以你需要使用getter方法來獲取信息。我*認爲*它默認獲得訂單商品產品,因此該類可能是'WC_Order_Item_Product',它擴展了'WC_Order_Item'。查看getters [here](https://github.com/woocommerce/woocommerce/blob/ master/includes/class-wc-order-item-product.php#L207)和[here](https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-order-item.php #L73) – helgatheviking

+0

我不記得'品牌'永遠是一個訂單項數組的關鍵,這可能是問題的一部分。你應該打開'WP_DEBUG_LOG',這樣你就可以看到發生了什麼。 – helgatheviking

+0

該品牌是我在變量產品 – thatryan

回答

0

這是我最好的猜測。這是不可能的,因爲我沒有和你一樣的設置。

幾點注意事項:

  1. $subscription對象傳遞給woocommerce_subscription_status_changed鉤讓我們使用它。
  2. $order->id應該在WC3.0中替換爲$order->get_id(),但我們打算使用$subscription對象(訂購訂單類擴展了訂單類,因此它類似)。
  3. 干將必須通過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); 

} 
+0

謝謝,這對於理解所需的不同方法非常有幫助。你怎麼知道有什麼方法可用,例如你在哪裏使用get_name(),有沒有「get_title()」也許?看起來變化選擇現在成爲「名稱」的一部分,因此不可靠。 – thatryan

+1

在這種情況下,我會建議使用['$ item-> get_product_id()'](https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-order-item-product.php #L226)並使用產品ID作爲條件。通過閱讀文檔和/或代碼本身,您會知道哪些方法可用,我承認這比var_dump()變量透明得多。 – helgatheviking

+0

謝謝我使用產品ID結束了!我發現它,但是對於我來說文檔是很難受的。 – thatryan

相關問題