Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.6k views
in Technique[技术] by (71.8m points)

php - Allow customer to change order status in WooCommerce

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 arrived by changing order status to complete.

I have seen Allowing customer to change status of the order via email related question code (without answers), that doesn't really help to achieve my goal.

Is it possible that the customer can confirm if the order has arrived by changing order status to "completed"?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...