简体   繁体   English

在 WooCommerce 中为新客户订单添加订单备注

[英]Add order note to new customer orders in WooCommerce

I'm trying to add in a feature where an admin order note will be added for all first time customers.我正在尝试添加一项功能,其中将为所有首次客户添加管理订单注释。

The code I am trying is:我正在尝试的代码是:

add_action('woocommerce_thankyou', 'is_returning_customer', 10, 1);

function is_returning_customer($order_id) 
{
    if (!$order_id) {
        return;
    }
    if(is_user_logged_in()) {
        $order_status = array('wc-on-hold,','wc-processing', 'wc-completed');
        $customer_id = get_current_user_id(); 
            $customer_orders=get_posts( array(
                'meta_key' => '_customer_user',
                'meta_value' => $customer_id,
                'post_type' => 'shop_order', 
                'post_status' => $order_status,
                'numberposts' => -1
            )
        );
     
    }
       if (count($customer_orders) => 1) {
        $order = wc_get_order( $order_id );
            $note = '*** New Customer ***';
            $order->add_order_note($note);
            $order->save();
        }
}

However, the problem it's adding the new customer note on every order.但是,问题是在每个订单上添加新的客户注释。 Any advice?有什么建议吗?

Your code looks fine except for syntax errors here.您的代码看起来很好,除了这里的语法错误。 I revised your code.我修改了你的代码。 try the below code.试试下面的代码。

Changed改变了

if (count($customer_orders) => 1) {

To

if (count($customer_orders) >= 1) {

Changed改变了

$order_status = array( 'wc-on-hold,','wc-processing', 'wc-completed' );

To

$order_status = array( 'wc-on-hold', 'wc-processing', 'wc-completed' );

for check customer is first time trying below condition.检查客户是第一次尝试以下条件。

if ( count( $customer_orders ) < 1 ) {

for check customer is a return.检查客户是退货。 try the below condition.尝试以下条件。

if ( count( $customer_orders ) > 0 ) {

Complete code.完整的代码。 for returning customer对于回头客

function is_returning_customer( $order_id ) {

    if ( !$order_id ) {
        return;
    }

    if( is_user_logged_in() ) {

        $order_status = array( 'wc-on-hold,','wc-processing', 'wc-completed' );
        $customer_id  = get_current_user_id(); 

            $customer_orders = get_posts( array(
                'meta_key'    => '_customer_user',
                'meta_value'  => $customer_id,
                'post_type'   => 'shop_order', 
                'post_status' => $order_status,
                'numberposts' => -1
            )
        );
     
    }

    if ( count( $customer_orders ) > 0 ) {
        $order = wc_get_order( $order_id );
        $note  = '*** New Customer ***';
        $order->add_order_note($note);
        $order->save();
    }
}
add_action( 'woocommerce_thankyou', 'is_returning_customer', 10, 1 );

Complete code for first time customer首次客户的完整代码

function is_first_time_customer( $order_id ) {

    if ( !$order_id ) {
        return;
    }

    if( is_user_logged_in() ) {

        $order_status = array( 'wc-on-hold,','wc-processing', 'wc-completed' );
        $customer_id  = get_current_user_id(); 

            $customer_orders = get_posts( array(
                'meta_key'    => '_customer_user',
                'meta_value'  => $customer_id,
                'post_type'   => 'shop_order', 
                'post_status' => $order_status,
                'numberposts' => -1
            )
        );
     
    }

    if ( count( $customer_orders ) < 1 ) {
        $order = wc_get_order( $order_id );
        $note  = '*** New Customer ***';
        $order->add_order_note($note);
        $order->save();
    }
}
add_action( 'woocommerce_thankyou', 'is_first_time_customer', 10, 1 );

Actually it is not necessary to go through the orders, as there is already a function for this in WooCommerce, namely wc_get_customer_order_count() - Get total orders by customer.其实go是没有必要通过订单的,因为在WooCommerce中已经有一个function,即wc_get_customer_order_count() - get total orders by customer。

Only the issue here is, just like with your current code, that this would only work for logged in users .只有这里的问题是,就像您当前的代码一样,这仅适用于已登录的用户

To make this also work for 'guests' you can use the following:要使这也适用于“客人” ,您可以使用以下内容:

function action_woocommerce_thankyou( $order_id ) {
    // Get $order object
    $order = wc_get_order( $order_id );
    
    // Is a WC_Order
    if ( is_a( $order, 'WC_Order' ) ) {
        // Get user id
        $user_id = $order->get_user_id();
        
        // Set variable
        $count = 0;
        
        // Not a guest
        if ( $user_id > 0 ) {
            // Get the total orders by a customer.
            $count = wc_get_customer_order_count( $user_id );
        } else {                
            // Guest 'user', don't have a user id so we will determine the previous orders based on the billing email
            
            // Get billing email
            $billing_email = $order->get_billing_email();
            
            if ( ! empty ( $billing_email ) ) {
                // Call function
                $count = has_guest_bought_by_email( $billing_email );
            }
        }
        
        // Output
        if ( $count == 1 ) {
            $note  = '** New Customer **';
            $order->add_order_note( $note );
        }
    }
}
add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );

// Based on https://stackoverflow.com/a/46216073/11987538
function has_guest_bought_by_email( $email ) {
    global $wpdb;
    
    // Get all order statuses.
    $order_statuses = array_map( 'esc_sql', array_keys( wc_get_order_statuses() ) );

    $results = $wpdb->get_col( "
        SELECT p.ID FROM {$wpdb->prefix}posts AS p
        INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
        WHERE p.post_status IN ( '" . implode( "','", $order_statuses ) . "' )
        AND p.post_type LIKE 'shop_order'
        AND pm.meta_key = '_billing_email'
        AND pm.meta_value = '$email'
    " );

    // Return result
    return count( $results ); 
}

Related: How to add a first order message after the buyer name in WooCommerce admin order list相关:如何在 WooCommerce 管理订单列表中的买家姓名后添加第一条订单消息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在客户批准 WooCommerce 中的订单时添加订单备注 - Add an order note to customers when they approve their orders in WooCommerce 将订单客户注释添加到YITH Woocommerce PDF发票 - Add order customer note to YITH Woocommerce PDF Invoice 在Woocommerce中显示客户订单评论(客户备注) - Display Customer order comments (customer note) in Woocommerce 将客户email和“订单”栏中的电话添加到Woocommerce的管理订单列表中 - Add customer email and phone in "Order" column to admin orders list on Woocommerce 将新列中的客户电子邮件添加到 Woocommerce 上的管理订单列表 - Add customer email in a new column to admin orders list on Woocommerce 在 Woocommerce 电子邮件通知中显示订单客户备注 - Display order customer note in Woocommerce email notifications 添加文本到 WooCommerce 客户完成订单 email 基于运输和订单备注 - Add a text to WooCommerce customer complete order email based on shipping and order note 从 WooCommerce 中的另一个脚本添加客户备注 - Add customer note from another script in WooCommerce 在Woocommerce中将订单交易ID添加到管理员新订单电子邮件通知中 - Add orders transaction id to admin new order email notification in Woocommerce 在 WooCommerce 我的帐户订单列表中添加发送给客户的管理员订单备注 - Add Admin order notes sent to customer in WooCommerce My Account Orders list
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM