在 WooCommerce 中添加一些用户用户元数据作为订单元数据

Add some user user meta data as order meta data in WooCommerce

一位客户创建了一个订阅并通过 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;

   }

}

您的代码中有一些错误。您应该从以下位置删除 $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 和其他一些代码示例时,似乎这个钩子有 2 个参数:$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 文件。它应该更好用。