如何在管理订单列表中添加客户和客人的首单列。

问题描述 投票:0回答:1

我想在WooCommerce的 "管理订单列表 "页面中增加一栏,告知我该用户是否是第一次购买。

我认为这个"检查客户是否已经在WooCommerce购买了东西"可以用于我的情况。

但是我不知道如何在WooCommerce的 "订单 "页面的一栏中添加。

php wordpress woocommerce hook-woocommerce orders
1个回答
0
投票

有了这一功能,我想在 "管理订单列表 "页面中增加一栏,告知我用户是否是第一次购买。manage_edit-shop_order_columns & manage_shop_order_posts_custom_column你可以添加一个新的列。

使用 wc_get_customer_order_count( $user_id ) 您可以得到一个客户的总订单。


注1: 因为客人没有 $user_id,我们使用 $billing_email 以确定当前和以前的订单。

注释2: 我部分使用了以下的方法 功能 - CREDITS: @LoicTheAztec

那么你就会得到

// Add a Header
function my_shop_order_column( $columns ) {
    // Add new column
    $columns['first_order'] = 'First order';

    return $columns;
}
add_filter( 'manage_edit-shop_order_columns', 'my_shop_order_column', 10, 1 );

// Populate the Column
function my_shop_order_list_column_content( $column, $post_id ) {
    // Compare
    if ( $column == 'first_order' ) {
        // Get order
        $order = wc_get_order( $post_id );

        // Get user id
        $user_id = $order->get_user_id();
        
        // Set variable
        $output = '';
        
        // 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 ) {
            $output = 'First order';
        } elseif ( $count > 1 ) {
            $output = 'Total orders = ' . $count;
        }
        
        echo $output;
    }
}
add_action( 'manage_shop_order_posts_custom_column' , 'my_shop_order_list_column_content', 10, 2 );

// CREDITS: @LoicTheAztec - 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 ); 
}
© www.soinside.com 2019 - 2024. All rights reserved.