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

标签 php wordpress woocommerce hook-woocommerce woocommerce-subscriptions

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

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

示例: /image/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 Hook 相关的更新:

看起来好像是to the docs对于其他一些代码示例,该 Hook 有 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 文件中。它应该能更好地工作。

关于php - 在 WooCommerce 中添加一些用户元数据作为订单元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62328993/

相关文章:

php - 如何在 PHP 中从数据库中订购字符串格式?

php - 在 laravel artisan 中从命令行下载文件

wordpress - 将 WordPress 网站从旧主机迁移到新主机的最简单方法是什么

php - 无法插入到wordpress数据库中

php - Laravel guzzle cURL 错误 6 : Could not resolve host: http (see http://curl. haxx.se/libcurl/c/libcurl-errors.html)

Php:分组并添加缺失的字段

php - 只有在 Wordpress 中有子菜单时才显示菜单项

php - Woocommerce 中的自定义动态运费成本计算

尝试添加文本时 CSS 函数 "content"不起作用

php - 重新定位 WooCommerce 文件页面中的产品链接