【问题标题】:WooCommerce Subscriptions hook: Get Order ItemsWooCommerce 订阅挂钩:获取订单商品
【发布时间】:2017-09-17 11:30:29
【问题描述】:

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

}

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

【问题讨论】:

  • 数组应该是向后兼容的,但是现在get_items() 返回一个WC_Order_Item 对象的数组,所以你需要使用getter 方法来获取信息。我认为它默认获取订单项目产品,因此该类可能是WC_Order_Item_Product,它扩展了WC_Order_Item。看看getter herehere
  • 我不记得 brand 曾经是订单项数组键,因此这可能是问题的一部分。你应该打开WP_DEBUG_LOG,这样你就可以看到发生了什么。
  • 品牌是我在可变产品中的自定义变体
  • 功能全面更新
  • 是的,整个功能好多了。 $item 现在是 WC_Order_Item_Product 对象,如果我不得不猜测从未支持“品牌”键。那么品牌是变体属性吗?

标签: php wordpress woocommerce orders woocommerce-subscriptions


【解决方案1】:

这是我的最佳猜测。由于我没有和你一样的设置,所以无法测试。

几点注意事项:

  1. $subscription 对象被传递给woocommerce_subscription_status_changed 钩子,所以让我们使用它。
  2. $order->id 应该在 WC3.0 中替换为 $order->get_id(),但我们将使用 $subscription 对象(订阅订单类扩展了订单类,因此类似)。
  3. getter 必须用于循环通过 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()”?看起来变体选择现在已成为“名称”的一部分,因此不可靠。
  • 在这种情况下,我建议使用 $item->get_product_id() 并使用产品 ID 作为条件。您可以通过阅读文档和/或代码本身知道哪些方法可用,我承认这比能够var_dump() 变量透明得多。
  • 谢谢我最终使用了产品 ID!我找到了,但是文档对我来说很难,呵呵。
  • 嘿@helgatheviking 有没有机会你可以看看我的另一个问题,为什么我现在在 3.0 中也无法弄清楚元数据? stackoverflow.com/questions/43532208/… :) 非常感谢。
猜你喜欢
  • 2020-08-17
  • 2021-04-02
  • 2018-05-12
  • 1970-01-01
  • 2017-12-03
  • 2019-07-29
  • 2016-06-07
  • 2021-04-21
  • 2017-03-21
相关资源
最近更新 更多