我使用以下代码在结帐时添加自定义费用:
function woocommerce_custom_surcharge() {
global $woocommerce;
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ($_REQUEST['s-baby-seats'] || $_REQUEST['s-taxi-return-id']) {
global $c_seats;
global $c_return_fare;
$baby_seats_fee = intval($c_seats[1]);
if ($_REQUEST['s-taxi-return-id']) {
$return_fee = intval($c_return_fare);
} else {
$return_fee = 0;
}
$surcharge = $baby_seats_fee + $return_fee;
$surcharge_label = esc_html__('Extra + Return', 'berrytaxiplon');
$woocommerce->cart->add_fee( $surcharge_label, $surcharge );
}
}
add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );费用是按预期添加的,但是结帐的order_review部分仍然是禁用blockUI的。我看不到任何php ('WP_DEBUG‘为真)或js控制台错误。我不知道如何调试这种行为。
如果我的代码只是添加$woocommerce->cart->add_fee( 'test', 5 );,那么订单审查就不会被阻止/禁用,用户可以正常下订单。
有什么想法吗?我的代码中有什么会导致这个问题,以及如何解决这个问题?谢谢!
编辑1:
我更改了函数,并将条件和$_requests移除如下:
function woocommerce_custom_surcharge() {
global $woocommerce;
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
global $c_seats;
global $c_return_fare;
$baby_seats_fee = intval($c_seats[1]);
$return_fee = intval($c_return_fare);
$surcharge = $baby_seats_fee + $return_fee;
$surcharge_label = esc_html__('Extra + Return', 'berrytaxiplon');
$woocommerce->cart->add_fee( $surcharge_label, $surcharge );
}
add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );现在,blockUI在几秒钟内就被删除了,但是它的费用,虽然它最初呈现正确,然后由js将其转换为0。
编辑2:
原来我一直都在用会话。由于这篇文章:从Woocommerce中的url变量中添加购物车费解决了
发布于 2019-04-12 00:32:54
You不能直接将值保存在您的钩子函数中,因为它没有存储在任何地方,并且在客户离开cart页面时会丢失它们。所以blockUI与此无关。
有两种方法可以保存(存储)张贴的值:
而且,您的代码有点过时了,因为不再需要$global woocommerce,而是由WC()代替。现在,在woocommerce_cart_calculate_fees钩式函数上,代码中缺少一个参数,即变量$cart ( WC_Cart对象)。
您的代码并不是真正可测试的,因为我们不知道什么是:
global $c_seats;
global $c_return_fare;您可以尝试以下两种方法中的一种:
1)数据张贴在Woocommerce单一产品页面外:
// Add custom cart item data on add to cart
add_filter( 'init', 'set_custom_data_requested_to_wc_sessions', 10, 3 );
function set_custom_data_requested_to_wc_sessions() {
if( isset($_REQUEST['s-baby-seats']) || isset($_REQUEST['s-taxi-return-id']) ) {
// Enable Woocommerce sessions (if not done yet)
if ( ! WC()->session->has_session() ) {
WC()->session->set_customer_session_cookie( true );
}
$session_data = []; // initializing
if( isset($_REQUEST['s-baby-seats']) && ! empty($_REQUEST['s-baby-seats']) ) {
// Add the dropdown value as custom cart item data
$session_data['baby_seats'] = wc_clean( esc_attr($_REQUEST['s-baby-seats']) );
}
if( isset($_REQUEST['s-taxi-return-id']) && ! empty($_REQUEST['s-taxi-return-id']) ) {
// Add the dropdown value as custom cart item data
$session_data['return_id'] = wc_clean( esc_attr($_REQUEST['s-taxi-return-id']) );
}
// Set the data to custom wc_sessions
if( sizeof($session_data) > 0 ) {
WC()->session->set('fee_data', $session_data);
}
}
}
// Add a fee
add_action( 'woocommerce_cart_calculate_fees','add_custom_surcharge', 10, 1 );
function add_custom_surcharge( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
global $c_seats, $c_return_fare;
$surcharge = 0; // Initializing
$fee_data = WC()->session->get('fee_data'); // Get the data from Woocommerce session
if( isset($fee_data['baby_seats']) || isset($fee_data['return_id']) ) {
$baby_seats_fee = isset($fee_data['baby_seats']) ? intval($c_seats[1]) : 0;
$return_id_fee = isset($fee_data['return_id']) && $fee_data['return_id'] ? intval($c_return_fare) : 0;
$surcharge = $baby_seats_fee + $return_id_fee; // Add to the fee cost
}
// Add the calculated fee
if ( $surcharge > 0 ) {
$cart->add_fee( esc_html__('Extra + Return', 'woocommerce'), $surcharge );
}
}代码在您的活动子主题(或活动主题)的function.php文件中。应该行得通。
2)在单一产品页中添加到购物车上的数据(基于购物车项目):
// Add custom cart item data on add to cart
add_filter( 'woocommerce_add_cart_item_data', 'filter_add_cart_item_data_callback', 10, 3 );
function filter_add_cart_item_data_callback( $cart_item_data, $product_id, $variation_id) {
if( isset($_REQUEST['s-baby-seats']) && ! empty($_REQUEST['s-baby-seats']) ) {
// Add the dropdown value as custom cart item data
$cart_item_data['s-baby-seats'] = wc_clean( esc_attr($_REQUEST['s-baby-seats']) );
$unique_key = true;
}
if( isset($_REQUEST['s-taxi-return-id']) && ! empty($_REQUEST['s-taxi-return-id']) ) {
// Add the dropdown value as custom cart item data
$cart_item_data['s-taxi-rid'] = wc_clean( esc_attr($_REQUEST['s-taxi-return-id']) );
$unique_key = true;
}
if( isset($unique_key) && $unique_key )
$cart_item_data['unique-key'] = md5(microtime().rand()); // Make each item unique
return $cart_item_data;
}
// Add a fee
add_action( 'woocommerce_cart_calculate_fees','add_custom_surcharge', 10, 1 );
function add_custom_surcharge( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
global $c_seats, $c_return_fare;
$surcharge = 0; // Initializing
// Loop through cart items
foreach( $cart->get_cart() as $cart_item ) {
if( isset($cart_item['s-baby-seats']) || isset($cart_item['s-taxi-rid']) ) {
$baby_seats_fee = isset($cart_item['s-baby-seats']) ? intval($c_seats[1]) : 0;
$taxi_return_fee = isset($cart_item['s-taxi-rid']) && $cart_item['s-taxi-rid'] ? intval($c_return_fare) : 0;
$surcharge += $baby_seats_fee + $return_fee; // Add to the fee cost
}
}
// Add the calculated fee
if ( $surcharge > 0 ) {
$cart->add_fee( esc_html__('Extra + Return', 'woocommerce'), $surcharge );
}
}代码在您的活动子主题(或活动主题)的function.php文件中。可能会管用的。
Related回答: 从Woocommerce中的url变量中添加购物车费
https://wordpress.stackexchange.com/questions/333775
复制相似问题