当前位置: 首页 > 知识库问答 >
问题:

获取商业\订单\状态\完成挂钩上的用户ID

晏沈义
2023-03-14

我写函数:

add_action( 'woocommerce_order_status_completed', 'order_completed');

function order_completed($order_id) {

    $user_id = $order->get_user_id(); // or $order->get_customer_id();
    $order = wc_get_order( $order_id );
    $items = $order->get_items();
    
    foreach ( $items as $item ) {
        $product_name = $item->get_name();          
    }  

    switch ($product_name) {
        case 'FREE':        
            update_user_meta($user_id, 'ads-available',  get_user_meta( $user_id, 'ads-available', true ) +1 );
            break;
      
        case 'VIP':
            update_user_meta($user_id, 'ads-available',  get_user_meta( $user_id, 'ads-available', true ) +3 );
            update_user_meta($user_id, 'karusel',  get_user_meta( $user_id, 'karusel', true ) +1 );
            break;  
    }

    
}

当我从仪表板更改状态顺序时,出现错误:

类型错误:E_ERROR行102文件 /var/www/ /data/www/web-design.com/wp-content/plugins/functions.php.未捕获错误:调用成员函数get_user_id()在 /var/www/ /data/www/web-design.com/wp-content/plugins/functions.php中为空:102堆栈跟踪:#0 /var/www/ /data/www/web-design.com/wp-includes/class-wp-hook.php(294):order_completed(862)#1 /var/www/ /data/www/web-design.com/wp-includes/class-wp-hook.php(316):WP_Hook-

行102它是-$user_id=$order-


共有2个答案

胡意致
2023-03-14

您只是错过了钩子函数中的第二个参数,即$order,即WC_OrderObject,因此$order=wc_get_order($order_id);不需要,您的错误将得到解决。

我重新访问并简化了您的代码:

add_action( 'woocommerce_order_status_completed', 'order_completed_update_user_meta', 10, 2 );
function order_completed_update_user_meta( $order_id, $order ) {
    // Check that user Id exist (registered users only)
    if( $user_id = $order->get_user_id() ) {
        $items = $order->get_items(); // Get order items
        $item  = reset($items); // Get first order item
        $name  = $item->get_name(); // Get first product name
        $value = get_user_meta( $user_id, 'ads-available', true ); // Get user meta 'ads-available'

        if ( $name === 'FREE' ) {
            update_user_meta($user_id, 'ads-available',  $value + 1 );
        } 
        elseif ( $name === 'VIP' ) {
            update_user_meta($user_id, 'ads-available',  $value + 3 );

            $karusel = get_user_meta( $user_id, 'karusel', true ); // Get user meta 'karusel'
            update_user_meta($user_id, 'karusel', $karusel + 1 ); 
        }
    }
}

代码进入活动子主题(或活动主题)的functions.php文件。它应该更有效。

向苗宣
2023-03-14

您可以使用\u customer\u user元键。获取用户id。

add_action( 'woocommerce_order_status_completed', 'order_completed' );
function order_completed( $order_id ) {

    $user_id = get_post_meta($order_id, '_customer_user', true);
    
    $order = wc_get_order( $order_id );
    $items = $order->get_items();
    
    foreach ( $items as $item ) {
        $product_name = $item->get_name();          
    }  

    switch ($product_name) {
        case 'FREE':        
          update_user_meta($user_id, 'ads-available',  get_user_meta( $user_id, 'ads-available', true ) +1 );
          break;
          
        case 'VIP':
          update_user_meta($user_id, 'ads-available',  get_user_meta( $user_id, 'ads-available', true ) +3 );
          update_user_meta($user_id, 'karusel',  get_user_meta( $user_id, 'karusel', true ) +1 );
          break;    
    }

}

或者你需要先得到订单对象,然后你可以使用$order-

add_action( 'woocommerce_order_status_completed', 'order_completed' );
function order_completed( $order_id ) {

    $order = wc_get_order( $order_id );
    $user_id = $order->get_user_id(); // or $order->get_customer_id();
            
    $order = wc_get_order( $order_id );
    $items = $order->get_items();
    
    foreach ( $items as $item ) {
        $product_name = $item->get_name();          
    }  

    switch ($product_name) {
        case 'FREE':        
          update_user_meta($user_id, 'ads-available',  get_user_meta( $user_id, 'ads-available', true ) +1 );
          break;
          
        case 'VIP':
          update_user_meta($user_id, 'ads-available',  get_user_meta( $user_id, 'ads-available', true ) +3 );
          update_user_meta($user_id, 'karusel',  get_user_meta( $user_id, 'karusel', true ) +1 );
          break;    
    }

}

 类似资料:
  • 从以下行代码输入: 如何从订单id获取WooCommerce订单详细信息?

  • 我在有以下规格的空气间隙环境中清除了rke: 节点: 主机类型/提供程序:VirtualBox(测试环境) cluster.yml文件: 复制的步骤: docker网络 问题是否与网络接口有关?如果是:我如何创建它?

  • 我需要对我的商店进行一些定制,但我不知道如何使用WC_Order类在PHP中创建WooCommerce订单。我怎样才能做到这一点? 这是我尝试过的代码:

  • 1.自动收货完成如何设置? 商家可以在【交易设置】里面设置自动确认收货时间,从发货时间开始后粉丝没有在手机端点击确定收货,后台系统到时间自动确定收货。 2.订单可以修改价格吗? 订单在待付款状态下可以修改价格。 3.已经完成的订单为什么自动就关闭? 用户通过额外方式导入的订单数据,导入的订单数据为待支付状态,订单的创建时间到现在时间超出了订单自动关闭时间 所以订单自动关闭了。 4.支付时,扫码提示

  • 问题内容: 我知道我可以打电话获取最新的Jenkins版本的状态。但是,由于我们的构建运行了很长时间(几个小时),所以我对最后一个 完整的 构建状态确实比在 此刻 正在 运行 的运行更感兴趣。 最后一个完全运行的构建是否有api端点?还是我应该拉动构建的完整列表并从那里选择倒数第二个? 问题答案: 尝试http:// $ host / job / $ jobname / lastSuccessfu

  • 我正在尝试使用状态将一个表单输入值复制到另一个表单输入值,但状态没有更新 我创建了一个带有按钮的表单,其中左侧表单输入的值应复制到右侧表单输入。这是我的代码: 无论我做什么,dbSecName的状态都不会改变。我试着设置一个新的常量。我尝试使onclick函数异步并等待。如果我为我试图设置的变量的值添加,我可以正确地看到它,但是dbSecName的console.log总是显示原始值。 我真的不知