Skip to content
Advertisement

Custom conditional redirections after WooCommerce checkout payment

I use Lirox One theme on WordPress with WooCommerce. I want make custom redirections after payment:
If a customer buy product ID 333, It will be redirected to product 444 (for example).

I have make some custom code but it doesn’t works, I get an error 500 (and debug is empty).

What I am doing wrong and how can I make it work?

This is my code:

add_action( 'woocommerce_thankyou', 'check_order_product_id', 1 );
function check_order_product_id( $order_id ){
$order = new WC_Order( $order_id );
    $items = $order->get_items();
    foreach ( $items as $item ) {
       $product_id = $item['product_id'];

          //* single product id
          if ( $product_id == 399 ) {
            // Content Title line
            $url = 'http://yoursite.com/custom-url1';
            }
          if ( $product_id == 358 ) {
            $url = 'http://yoursite.com/custom-url2';
          }
          if ( $product_id == 398 ) {
            $url = 'http://yoursite.com/custom-url3';
          }

          if ( $product_id == 357) {
            $url = 'http://yoursite.com/custom-url5';
          }

          if ( $product_id == 356) {
            $url = 'http://yoursite.com/custom-url6';
          }

          if ( $product_id == 335) {
            $url = 'http://yoursite.com/custom-url';
          }
          if ( $order->status != 'failed' ) {
    wp_redirect($url);
    exit;
}

Advertisement

Answer

For redirections, use a custom function hooked in WordPress template_redirect action hook,
to avoid errors 500…

I have changed your code as you will see, to match your requirements. This code is made for WooCommerce version 3+:

add_action( 'template_redirect', 'conditional_redirection_after_payment');
function conditional_redirection_after_payment(){
    // When "thankyou" order-received page is reached …
    if ( is_wc_endpoint_url( 'order-received' ) ) {
        global $wp;

        // Get the order ID from the browser url
        $order_id =  intval( str_replace( 'checkout/order-received/', '', $wp->request ) );

        // Get an instance of the WC_Order object
        $order = wc_get_order( $order_id );

        // If the order status is 'failed' we stop the function
        if( $order->has_status( 'failed' ) ) return;

        // HERE set in the array for each product ID the coresponding url final path
        $product_id_url_paths = array(
            '399' => '/custom-url1',
            '358' => '/custom-url2',
            '398' => '/custom-url3',
            '357' => '/custom-url4',
            '356' => '/custom-url5',
            '335' => '/custom-url6',
        );

        // Iterating through each order items
        foreach( $order->get_items() as $item_id => $item_values ){
            // The Product ID
            $product_id = $item_values->get_product_id();

            foreach( $product_id_url_paths as $key_id => $url_path ){
                if( $key_id == $product_id ){
                    // Product is found and ID match: we got our path url. We redirect
                    wp_redirect( home_url( $url_path ) );
                    exit(); // always exit
                }
            }
        }
    }
}

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

Code is tested and works on WC 3+

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement