WooCommerce 结帐付款后的自定义条件重定向

Custom conditional redirections after WooCommerce checkout payment

我在带有 WooCommerce 的 Wordpress 上使用 Lirox One 主题。我想在付款后进行自定义重定向:
如果客户购买产品 ID 333,它将被重定向到产品 444(例如)。

我已经编写了一些自定义代码,但它不起作用,我收到错误 500(并且调试为空)。

我做错了什么,我怎样才能让它发挥作用?

这是我的代码:

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;
}

注意: 在您的代码中,您必须删除在 wp_redirect 之后使用的 exit。其他一切都会正常工作。为了更好地理解概念,下面提供了更多参考资料。

Explanation: Then you Provide Redirect only for the Particular Product ID alone not For all the Product IDS since it may lead you to the Internal Server Error as it is in the Foreach Loop.

可以使用 wp_redirect() 进行重定向。

您检查的产品 ID 是正确的。问题是,如果要显式传递 URL,则必须遵循另一种方法。

// We don't know for sure whether this is a URL for this site,
// so we use wp_safe_redirect() to avoid an open redirect.
wp_safe_redirect( $url );

// We are trying to redirect to another site, using a hard-coded URL.
wp_redirect( 'https://example.com/some/page' );

更多参考:

<?php wp_redirect( home_url() ); exit; ?>

Redirects can also be external, and/or use a “Moved Permanently” code :

<?php wp_redirect( 'http://www.example-one.com', 301 ); exit; ?>

The code below redirects to the parent post URL which can be used to redirect attachment pages back to the parent.

<?php wp_redirect( get_permalink( $post->post_parent ) ); exit; ?>

参考: https://developer.wordpress.org/reference/functions/wp_redirect/

对于重定向,使用 WordPress template_redirect 操作挂钩中的自定义函数,
避免错误 500…

如您所见,我已经更改了您的代码以满足您的要求。此代码适用于 WooCommerce 版本 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
                }
            }
        }
    }
}

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。

代码已经过测试并可在 WC 3+ 上运行

接受的答案适用于 Woocommerce 3+,对于旧版本(我使用的是 2.6.4)则无效。对于使用此版本的任何其他人,请尝试以下代码:

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;

    $order_id =  intval( str_replace( 'checkout/order-received/', '', $wp->request ) );
    // Get an instance of the WC_Order object
    $order = new WC_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(
        '1234' => '/your-path/'
    );
    // Iterating through each order items
    foreach( $order->get_items() as $item){
       // echo $item_id;
        // The Product ID
        $product_id = $item['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
            }
        }
    }
}

}