WooCommerce结帐付款后自定义条件重定向
问题描述:
我在WooCommerce上使用Wordpress上的Lirox One主题。我想在付款后进行自定义重定向:
如果客户购买产品ID 333,它将被重定向到产品444(例如)。WooCommerce结帐付款后自定义条件重定向
我已经做了一些自定义代码,但它不起作用,我得到一个错误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;
}
答
对于重定向,使用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+
答
注:在你的代码必须删除您拥有wp_redirect
之后使用的exit
。其他一切都会正常工作。为了更好地理解概念,下面提供了更多参考资料。
说明:那你只对特定产品 ID提供重定向不能单独对所有的产品ID,因为它可能会导致您的 内部服务器错误,因为它是在foreach循环中。
很好,使用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/
不要的理由'foreach'loop ...循环的第一次运行之后,你会重定向无论如何,所以循环赢得”有史以来第二次执行... – Twinfriends