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+