首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用操作blockUI时,woocommerce_cart_calculate_fees会阻止结帐。

当使用操作blockUI时,woocommerce_cart_calculate_fees会阻止结帐。
EN

WordPress Development用户
提问于 2019-04-08 11:45:51
回答 1查看 2K关注 0票数 1

我使用以下代码在结帐时添加自定义费用:

代码语言:javascript
复制
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移除如下:

代码语言:javascript
复制
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变量中添加购物车费解决了

EN

回答 1

WordPress Development用户

回答已采纳

发布于 2019-04-12 00:32:54

You不能直接将值保存在您的钩子函数中,因为它没有存储在任何地方,并且在客户离开cart页面时会丢失它们。所以blockUI与此无关。

有两种方法可以保存(存储)张贴的值:

  1. 在Woocommerce会话中,如果该自定义数据被张贴在Woocommerce单一产品页面之外。
  2. 在add事件上,如果在客户单击add (在单个产品页中)时发布该自定义值。

而且,您的代码有点过时了,因为不再需要$global woocommerce,而是由WC()代替。现在,在woocommerce_cart_calculate_fees钩式函数上,代码中缺少一个参数,即变量$cart ( WC_Cart对象)。

您的代码并不是真正可测试的,因为我们不知道什么是:

代码语言:javascript
复制
global $c_seats;
global $c_return_fare;

您可以尝试以下两种方法中的一种:

1)数据张贴在Woocommerce单一产品页面外:

代码语言:javascript
复制
// 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)在单一产品页中添加到购物车上的数据(基于购物车项目):

代码语言:javascript
复制
// 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变量中添加购物车费

票数 0
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/333775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档