Allow customer to change order status in WooCommerce

后端 未结 1 471
臣服心动
臣服心动 2021-01-23 06:49

In WooCommerce, when an order is in processing status, I would like on "My Account" Page to display an action button allowing customer to confirm that the order has ar

相关标签:
1条回答
  • 2021-01-23 07:46

    You can use woocommerce_my_account_my_orders_actions to add a custom action button to "My account" orders section, for orders with "processing" status (and also to view order).

    Then using template_redirect hook, it is possible for the customer to change the status of one of its processing orders, displaying a success notice.

    The code:

    // The button Url and the label
    function customer_order_confirm_args( $order_id ) {
        return array(
            'url'  => wp_nonce_url( add_query_arg( 'complete_order', $order_id ) , 'wc_complete_order' ),
            'name' => __( 'Approve order', 'woocommerce' )
        );
    }
    
    // Add a custom action button to processing orders (My account > Orders)
    add_filter( 'woocommerce_my_account_my_orders_actions', 'complete_action_button_my_accout_orders', 50, 2 );
    function complete_action_button_my_accout_orders( $actions, $order ) {
        if ( $order->has_status( 'processing' ) ) {
            $actions['order_confirmed'] = customer_order_confirm_args( $order->get_id() );
        }
        return $actions;
    }
    
    // Add a custom button to processing orders (My account > View order)
    add_action( 'woocommerce_order_details_after_order_table', 'complete_action_button_my_accout_order_view' );
    function complete_action_button_my_accout_order_view( $order ){
        // Avoiding displaying buttons on email notification
        if( is_wc_endpoint_url( 'view-order' ) ) {
            $data = customer_order_confirm_args( $order->get_id() );
    
            echo '<div style="margin:16px 0 24px;">
                <a class="button" href="'.$data['url'].'">'.$data['name'].'</a>
            </div>';
        }
    }
    
    // Change order status and display a message
    add_action( 'template_redirect', 'action_complete_order_status' );
    function action_complete_order_status( $query ) {
        if ( ( is_wc_endpoint_url( 'orders' )
            || is_wc_endpoint_url( 'view-order' ) )
            && isset( $_GET['complete_order'] )
            && $_GET['complete_order'] > 1
            && isset($_GET['_wpnonce'])
            && wp_verify_nonce($_GET['_wpnonce'], 'wc_complete_order') )
        {
            $order = wc_get_order( absint($_GET['complete_order']) );
    
            if ( is_a($order, 'WC_Order') ) {
                // Change order status to "completed"
                $order->update_status( 'completed', __('Approved by the customer', 'woocommerce') ) ;
    
                // Add a notice (optional)
                wc_add_notice( sprintf( __( 'Order #%s has been approved', 'woocommerce' ), $order->get_id() ) );
    
                // Remove query args
                wp_redirect( esc_url( remove_query_arg( array( 'complete_order', '_wpnonce' ) ) ) );
                exit();
            }
        }
    }
    

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

    Related (old answer): Allow customer to change the order status in WooCommerce My account

    0 讨论(0)
提交回复
热议问题