WooCommerce根据产品ID重定向感谢页面不会清空购物车

时间:2019-04-26 作者:user166836

在WooCommerce中,我使用以下代码在购买特定产品后将用户重定向到自定义感谢页面。它获取产品ID,然后根据该ID重定向。

我已将下面的代码粘贴到functions.php:

add_action( \'template_redirect\', \'redirect_thankyou_1month\' );

function redirect_thankyou_1month(){

    /* do nothing if we are not on the appropriate page */
    if( !is_wc_endpoint_url( \'order-received\' ) || empty( $_GET[\'key\'] ) ) {
        return;
    }

    $order_id = wc_get_order_id_by_order_key( $_GET[\'key\'] );
    $order = wc_get_order( $order_id );

    foreach( $order->get_items() as $item ) {
        if( $item[\'product_id\'] == 2781 ) {
            wp_redirect( \'/ar1m/\' );
            exit;
        }
    }
}
问题是在购买后使用此代码段时,购买的物品仍保留在购物车中。我已经使用了这个特定的代码,所以仍然可以进行跟踪;但是,如果需要,我可以使用另一种跟踪方法,因此我不反对使用woocommerce_get_return_url...

1 个回复
SO网友:LoicTheAztec

您的实际代码有点过时,不太安全……因为WooCommerce 3订单项现在是对象$item[\'product_id\'] 替换为$item->get_product_id().

您应该首先尝试使用woocommerce_get_return_url 例如:

add_action( \'woocommerce_get_return_url\', \'custom_order_received_return_url\', 10, 2 );
function custom_order_received_redirect( $return_url, $order ){
    // HERE define your products IDs in the array
    $product_ids = array(741);

    // HERE define your redirection URL (with the order ID as argument if needed)
    $redirection_url = home_url(\'/ar1m/\');

    if ( is_ssl() || get_option( \'woocommerce_force_ssl_checkout\' ) == \'yes\' ) {
        $redirection_url = str_replace( \'http:\', \'https:\', $redirection_url );
    }

    // Loop through order items
    foreach( $order->get_items() as $item ) {
        if( in_array( $item->get_product_id(), $product_ids ) ) {
            return $redirection_url;
        }
    }
}
代码进入功能。活动子主题(或活动主题)的php文件。它应该会起作用。

如果没有,以下代码将在“订单已收到”页面上为定义的产品ID进行自定义重定向,emptying cart (如果需要)并检查订单是否有效:

add_action( \'template_redirect\', \'custom_order_received_redirect\' );
function custom_order_received_redirect(){
    // Only on order received (thankyou) page for a valid Order ID
    if( is_wc_endpoint_url(\'order-received\')
        && ( $order_id = absint( get_query_var(\'order-received\') ) )
        && get_post_type($order_id) === \'shop_order\'
        && isset( $_GET[\'key\'] ) ) {

        // Empty cart
        if ( ! WC()->cart->is_empty() ) {
            WC()->cart->empty_cart();
        }

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

        // Check that the order key is valid
        if( is_a($order, \'WC_Order\') && $order->get_order_key() === esc_attr($_GET[\'key\']) ) {

            // HERE define your products IDs in the array
            $product_ids = array(2781);

            // HERE define your redirection URL (with the order ID as argument if needed)
            $redirection_url = home_url("/ar1m/");

            // Loop through order items
            foreach( $order->get_items() as $item ) {
                if( in_array( $item->get_product_id(), $product_ids ) ) {
                    wp_redirect( $redirection_url );
                    exit();
                }
            }
        }
    }
}
代码进入功能。活动子主题(或活动主题)的php文件。已测试并正常工作。

您可以通过Order ID 在重定向url中,如:

$redirection_url = home_url("/ar1m/?order_id=$order_id");
然后你就可以得到Order ID 在重定向页面上,使用:

if( isset($_GET[\'order_id\']) && get_post_type($_GET[\'order_id\']) === \'shop_order\' ) {
    $order_id = absint($_GET[\'order_id\']);
}

相关推荐

无法获取Function.php代码以删除实时站点上丢失的密码链接

从我的live站点中删除丢失的密码文本时遇到问题。出于某种原因,在彻底检查了几乎所有内容后(我想我一定错过了什么),文本仍在显示。我把它放在一个儿童主题中,并测试了儿童主题是“带来阅读”,它确实是。很奇怪。更改了PHP版本等,所有内容都是最新的,仍然显示。但在我的本地和现场测试站点上,它正在按需要删除。对于可能导致问题的原因,如有任何帮助,我们将不胜感激。function remove_lostpassword_text ( $text ) { if ($text == \'Lo