【问题标题】:Add some user user meta data as order meta data in WooCommerce在 WooCommerce 中添加一些用户用户元数据作为订单元数据
【发布时间】:2020-10-01 08:51:12
【问题描述】:

客户创建订阅并通过 WooCommerce 告诉我他需要什么。使用用户元数据将需求存储在用户配置文件中。当他在前端的 WooCommerce 我的帐户区域更新此内容时,它会在 Wordpress 客户资料中正常更新。没有问题。

我遇到的问题是,当他通过前端 WooCommerce 帐户区域内的自定义字段更新要求时,订阅会一遍又一遍地更新他的旧要求。我如何让它在订阅续订时使用帐户区域内的最新自定义字段数据?

示例: https://i.stack.imgur.com/UEMpY.png

这就是我目前所拥有的。在下面的示例中,我尝试将用户元数据复制到订单元数据并在订阅续订时对其进行更新。由于某种原因,它没有更新。也许这是错误的方式。我的 PHP 非常有限。谁能给点建议?

// update subscription meta order
add_action('woocommerce_subscription_renewal_payment_complete','subscription_renew');
function subscription_renew( $order_id ) {

   $order = wc_get_order( $order_id ); // get the order id
   $user_id = $order->get_user_id(); // get the user id

   if ( $order->get_total() > 1 ) {  // not sure why this is here

   $getsend = get_user_meta( $user_id, 'send' ); // grab the user meta field 'send'
   $getcategories = get_user_meta( $user_id, 'categories' ); // grab the user meta field 'categories'

      // now do the update
      $order->update_meta_data( $user_id, 'send', $getsend ); // update user order meta field 'send'
      $order->update_meta_data( $user_id, 'categories', $getcategories ); // update user order meta field 'categories'
      $order_id = $order->save(); // save the order

      return $order_id;

   }

}

【问题讨论】:

  • @LoicTheAztec 标签

标签: php wordpress woocommerce hook-woocommerce woocommerce-subscriptions


【解决方案1】:

您的代码中有一些错误。您应该从以下位置删除 $user_id 参数:

  // now do the update
  $order->update_meta_data( $user_id, 'send', $getsend ); // update user order meta field 'send'
  $order->update_meta_data( $user_id, 'categories', $getcategories ); // update user order meta field 'categories'

替换为:

  // now do the update
  $order->update_meta_data( 'send', $getsend ); // update user order meta field 'send'
  $order->update_meta_data( 'categories', $getcategories ); // update user order meta field 'categories'

现在应该可以更好地工作了。


更新woocommerce_subscription_renewal_payment_complete挂钩:

在查看to the docs 和其他一些代码示例时,这个钩子似乎有两个参数:$subscription$last_order (但不是$order_id

这是一个应该真正起作用的不同代码版本,将您的自定义用户数据添加到最后一个相关的续订订单中,作为订单元数据:

add_action( 'woocommerce_subscription_renewal_payment_complete', 'add_order_meta_from_custom_user_meta', 10, 2 );
function add_order_meta_from_custom_user_meta( $subscription, $last_order ) {
    if( ! $subscription ) 
        return;

    $user_id = $last_order->get_user_id(); // Get the user id

    if( $send = get_user_meta( $user_id, 'send', true ) ) {
        $last_order->update_meta_data( 'send', $send );
    }

    if( $categories = get_user_meta( $user_id, 'categories', true ) ) {
        $last_order->update_meta_data( 'categories', $categories );
    }

    if( isset($send) || isset($categories) ) {
        $last_order->save();
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件中。它应该更好地工作。

【讨论】:

  • 太棒了!谢谢你。这有效,但仅当您从管理后端为客户续订订单时。当客户从前端续订订单时,它不起作用。这是为什么呢?
  • @Knights 我不知道客户续订的原因是什么,但我已经在我的答案中添加了更新,因为您的代码中还有其他一些错误。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2021-07-10
  • 2019-09-12
  • 2021-06-01
  • 2014-10-26
  • 2020-01-17
  • 2021-11-13
相关资源
最近更新 更多