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

问题描述:

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

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

几点注意事项:

  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