Change user role based on WooCommerce yearly orders count

旧时模样 提交于 2021-02-08 09:14:06

问题


I'm trying to implement a feature where customers receive a new user role after a certain amount of orders have been made, but all those orders must have been made within the same year.

I was able to assign the user role based on nth number of orders but can't seem to go beyond to where the date needs to be taken into consideration, can someone point me in the right direction or point out what I might be missing.

This is what I have tried so far.

function change_user_role_on_order_status_completed( $order_id ) {

    $order = new WC_Order( $order_id );

    $user_id = $order->user_id;

    $order_this_year = false;

    $current_date = date('Y');

    $total_orders = get_posts( array(
        'numberposts' => -1,
        'meta_key'    => '_customer_user',
        'meta_value'  => $user_id,
        'post_type'   => 'shop_order',
    ) );

    if ( $total_orders > 1 ) {
        foreach ($order->get_items() as $item_key => $item_values):

            // Get the item date
            if ($item_date = $item_values->get_date_completed()->format ('Y') == $current_date) {
                $order_this_year = true;
            }

        endforeach;

        if ($order_this_year) {
            $user = new WP_User( $order->user_id );

            // Set role editor
            $user->set_role( 'customer_club' ); 
        }

    }
}

add_action( 'woocommerce_order_status_completed', 'change_user_role_on_order_status_completed', 10, 1 );

回答1:


Using WC_Order_Query here is a much lighter and simple way to change the user role based on yearly orders count:

add_action( 'woocommerce_order_status_completed', 'change_user_role_on_order_status_completed', 10, 2 );
function change_user_role_on_order_status_completed( $order_id, $order ) {
    // Here set the minimal order count
    $min_orders_count = 3;

    // The WC_Order_Query
    $queried_orders = wc_get_orders( array(
        'limit'        => -1,
        'customer_id'  => $order->get_customer_id(),
        'date_paid'    => '>=' . date('Y') . '-01-01', // or 'date_created'
        'return'       => 'ids'
    ) );

    if ( sizeof($queried_orders) >= $min_orders_count ) {
        // Get an instance of the customer WP_User Object
        $user = $order->get_user();

        // Change the user role
        $user->set_role( 'customer_club' );
    }
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.



来源:https://stackoverflow.com/questions/55019934/change-user-role-based-on-woocommerce-yearly-orders-count

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!