首页 > 解决方案 > WooCommerce 自定义插件:检查客户完成的订单问题

问题描述

我正在尝试编写一个简单的插件来显示新的或返回的客户信息以及来自用户的已完成订单的数量。为此,我创建了一个名为 Returning-customers.php 的文件夹和同名文件。在这个文件中,我编写了以下代码:

/*
 * Plugin Name: Kasha returning customers
 * Description: Displays information returning customer or new, and also displays the number of completed orders
 * Version: 1.0.0
 * Author: Me
 * License: GPLv2 or later
 */


add_filter( 'woocommerce_admin_order_data_after_order_details', 'render_customer_is_new_field' );

function render_customer_is_new_field($order)
{

    $args = array(
        'status' => 'completed',
        'return' => 'ids',
    );
    
    if ( $order->get_user_id() !== 0 ) {
        $args['customer_id'] = $order->get_customer_id();
    } else {
        $args['customer'] = $order->get_billing_email();
    }
    
    $customer_has_existing_orders  = wc_get_orders( $args );

    $orders_count = count($customer_has_existing_orders);

    $markData = ( (int)count($customer_has_existing_orders) >= 2 )
        ? array('status-processing', 'Returning customer')
        : array('status-on-hold', 'New Customer');


    echo '
    <p class="kasha-customer-counter" style="float: left">
        <mark class="order-status '. $markData[0] .'">
            <span>'. $markData[1] .' <strong style="color:#ff0000;font-weight: 900;"> '. $orders_count .'</strong></span>
        </mark>
    </p>
    ';
}

但是这段代码不能正常工作。我总是看到客户已经退货并且他的所有订单都被考虑在内。但是,只有在两个状态为已完成的订单后才应放置用户正在返回客户的标记,并且仅应考虑状态为已完成的订单。现在看起来 wc_get_orders 函数不起作用。当我写: var_dump(wc_get_orders()) 我看到 NULL。

标签: phpwordpresswoocommercepluginshook-woocommerce

解决方案


首先,您的文件夹名称应该只被称为returning-customers不带.php名称或任何名称(小写,不带空格),woo-returning-customers因为它与 wwocommerce 相关。你可以保持你的 php 文件名不变。

然后使用以下内容:

/*
 * Plugin Name: Kasha returning customers
 * Plugin URI:
 * Description: Displays information returning customer or new, and also displays the number of completed orders.
 * Version: 1.0.0
 * Author: Me
 * Author URI:
 * License: GPLv2 or later
 */

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    add_action( 'woocommerce_admin_order_data_after_order_details', 'render_customer_is_new_field' );
    function render_customer_is_new_field( $order ) {
        if( is_a( $order, 'WC_Order') ) {
            $args = array(
                'limit'  => -1,
                'status' => 'completed',
                'return' => 'ids',
            );

            if ( $order->get_user_id() > 0 ) {
                $args['customer_id'] = $order->get_customer_id();
            } else {
                $args['customer'] = $order->get_billing_email();
            }

            $orders_ids   = wc_get_orders( $args );
            $orders_count = intval( count($orders_ids) );
            $markData     = ( $orders_count > 1 ) ? array('status-processing', 'Returning customer') : array('status-on-hold', 'New Customer');

            echo '
            <p class="kasha-customer-counter" style="float: left">
                <mark class="order-status '. $markData[0] .'">
                    <span>'. $markData[1] .' <strong style="color:#ff0000;font-weight: 900;"> '. $orders_count .'</strong></span>
                </mark>
            </p>';
        }
    }
}

经过测试并在最后一个 WooCommerce 版本上运行(并且应该适用于自 3.0 以来的所有版本)


推荐阅读