phpwordpresswoocommerceorderscancel-button

Conditional Cancel Button on my account orders list in Woocommerce


This is in reference to Add Cancel button on My account Orders list using Woo Cancel for Customers Plugin answer:

I also tried adding the function into functions.php and also get the too few arguments error: enter image description here

I did the same function provided by LoicTheAztec:

add_filter( 'woocommerce_valid_order_statuses_for_cancel', 'custom_valid_order_statuses_for_cancel', 10, 2 );
function custom_valid_order_statuses_for_cancel( $statuses, $order ){

// Set HERE the order statuses where you want the cancel button to appear
$custom_statuses    = array( 'pending', 'processing', 'on-hold', 'failed' );

// Set HERE the delay (in days)
$duration = 3; // 3 days

// UPDATE: Get the order ID and the WC_Order object
if( isset($_GET['order_id']))
    $order = wc_get_order( absint( $_GET['order_id'] ) );

$delay = $duration*24*60*60; // (duration in seconds)
$date_created_time  = strtotime($order->get_date_created()); // Creation date time stamp
$date_modified_time = strtotime($order->get_date_modified()); // Modified date time stamp
$now = strtotime("now"); // Now  time stamp

// Using Creation date time stamp
if ( ( $date_created_time + $delay ) >= $now ) return $custom_statuses;
else return $statuses;
}

Solution

  • As this hook is used 2 times in the Woocommerce core code with a different number of arguments for each:

    It's complicate to handle, without making some issue…

    I have found the following turn around (a very light update) that should solve the issue:

    add_filter( 'woocommerce_valid_order_statuses_for_cancel', 'filter_valid_order_statuses_for_cancel', 20, 2 );
    function filter_valid_order_statuses_for_cancel( $statuses, $order = '' ){
    
        // Set HERE the order statuses where you want the cancel button to appear
        $custom_statuses    = array( 'pending', 'processing', 'on-hold', 'failed' );
    
        // Set HERE the delay (in days)
        $duration = 3; // 3 days
    
        // UPDATE: Get the order ID and the WC_Order object
        if( ! is_object( $order ) && isset($_GET['order_id']) )
            $order = wc_get_order( absint( $_GET['order_id'] ) );
    
        $delay = $duration*24*60*60; // (duration in seconds)
        $date_created_time  = strtotime($order->get_date_created()); // Creation date time stamp
        $date_modified_time = strtotime($order->get_date_modified()); // Modified date time stamp
        $now = strtotime("now"); // Now  time stamp
    
        // Using Creation date time stamp
        if ( ( $date_created_time + $delay ) >= $now ) return $custom_statuses;
        else return $statuses;
    }
    

    Code goes in function.php file of your active child theme (or active theme). It should work now.

    enter image description here