phpwoocommercehook-woocommerceordersstatus

Add a Cancel order button to WooCommerce My account View Order pages


Is there a way to insert a button or link to cancel the order inside the page view-order of woocommerce?


Solution

  • Updated

    You can use these simple functions, where you will set the desired order statuses (on both functions), to display the cancel order button on My Account Order View pages:

    add_action( 'woocommerce_order_details_after_order_table', 'custom_order_cancel_button' );
    function custom_order_cancel_button( $order ) {
        $statuses = array( 'pending', 'on-hold', 'processing', 'completed' ); // Define order statuses
    
        if ( is_wc_endpoint_url('view-order') && $order->has_status($statuses) ) {
            printf('<div style="clear:both;margin-bottom:24px;"><a href="%s" class="woocommerce-button cancel button">%s</a></div>',
                $order->get_cancel_order_url( wc_get_endpoint_url('orders') ),
                __( 'Cancel', 'woocommerce' )
            );
        }
    }
    
    add_filter( 'woocommerce_valid_order_statuses_for_cancel', 'filter_valid_order_statuses_for_cancel' );
    function filter_valid_order_statuses_for_cancel( $statuses ){
        if ( ! is_wc_endpoint_url('orders') ) {
            $statuses = array( 'pending', 'on-hold', 'processing', 'completed' ); // Define order statuses
        }
        return $statuses;
    }
    

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


    If you want this cancel button to appear also in My Account Orders list, replace the last function with:

    add_filter( 'woocommerce_valid_order_statuses_for_cancel', 'filter_valid_order_statuses_for_cancel' );
    function filter_valid_order_statuses_for_cancel( $statuses ){
        $statuses = array( 'pending', 'on-hold', 'processing', 'completed' ); // Define order statuses
        return $statuses;
    }
    

    Related: Conditional Cancel Button on my account orders list in Woocommerce