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);
}
基本上我需要获取订阅的变体名称以存储在我的数据库中,以及我制作的自定义元字段。哪些不工作了
这是我最好的猜测。这是不可能的,因为我没有和你一样的设置。
几点注意事项:
- 的
$subscription
对象传递给woocommerce_subscription_status_changed
钩让我们使用它。 -
$order->id
应该在WC3.0中替换为$order->get_id()
,但我们打算使用$subscription
对象(订购订单类扩展了订单类,因此它类似)。 - 干将必须通过
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);
}
谢谢,这对于理解所需的不同方法非常有帮助。你怎么知道有什么方法可用,例如你在哪里使用get_name(),有没有“get_title()”也许?看起来变化选择现在成为“名称”的一部分,因此不可靠。 – thatryan
在这种情况下,我会建议使用['$ item-> get_product_id()'](https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-order-item-product.php #L226)并使用产品ID作为条件。通过阅读文档和/或代码本身,您会知道哪些方法可用,我承认这比var_dump()变量透明得多。 – helgatheviking
谢谢我使用产品ID结束了!我发现它,但是对于我来说文档是很难受的。 – thatryan
的阵列应该是回到兼容,但现在'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
我不记得'品牌'永远是一个订单项数组的关键,这可能是问题的一部分。你应该打开'WP_DEBUG_LOG',这样你就可以看到发生了什么。 – helgatheviking
该品牌是我在变量产品 – thatryan