php - Woocommerce 临时购物车税未根据第一个请求正确计算

标签 php wordpress woocommerce methods cart

我正在为难以填写复杂的 Woocommerce“新订单”表单(以及需要连续单击的所有更新和计算按钮)的客户制作自定义快速订单表单插件...

我已经能够使用 WC()->customer->set_billing_state() 设置客户的送货和帐单地址。和WC()->customer->set_shipping_state()等并获取元素的 UPS 费率,但税费计算似乎总是需要第二个 ajax 请求才能正常工作。

例如...我输入帐单/送货地址、行项目,然后点击“计算送货”...此操作还会返回 WC()->cart->get_tax_totals() 的输出但是,当我第一次请求时,它总是不退税。如果我第二次点击“计算运费”,它会显示正确的税费。同样,如果我更改送货地址并点击“计算运费”,则原始税费将保留,直到我第二次点击“计算运费”...

我将如何强制 Woocommerce 根据提交的地址计算税费,为什么会出现这种情况?

add_action('wp_ajax_docalcshipping','docalcshipadmin');
function docalcshipadmin(){
    
    //decode the cart data from POST
    $items=$_POST['items'];
    
    //create a new Cart object
    WC()->cart->empty_cart();
    
    if ( WC()->cart->get_cart_contents_count() == 0 ) {

        foreach($items as $n => $item){
            WC()->cart->add_to_cart( $item['item_id'],$item['qty'] );
        }

    }
    
    WC()->customer->set_billing_city($_POST['billing_city']);
    WC()->customer->set_billing_state($_POST['billing_state']);
    WC()->customer->set_billing_postcode($_POST['billing_zipcode']);
    
    WC()->customer->set_shipping_city($_POST['shipping_city']);
    WC()->customer->set_shipping_state($_POST['shipping_state']);
    WC()->customer->set_shipping_postcode($_POST['shipping_zipcode']);
    
    //run shipping calculation
    $shipData=WC()->shipping->calculate_shipping( WC()->cart->get_shipping_packages());
        
    $ratesOut='';
    foreach($shipData as $n => $d){
        foreach($d['rates'] as $nn => $dd){
            $ratesOut .= '<p><label><input type="radio" name="shipping_method" value="'.$nn.'" /> '.$dd->get_label().' <b>$'.$dd->get_cost().'</b></label></p>';
        }
    }
    
    $output=array('shipout'=>$ratesOut);

    
    //get TAX calculation
    $taxes=WC()->cart->get_tax_totals();
    
    if(count($taxes) == 0){
        $output['taxout']='NONE';
    }else{
    
        $taxOut=array();
        foreach($taxes as $tax){
            $taxOut[$tax->label]=$tax->amount;
        }
        $output['taxout']=$taxOut;
    }
    
    echo json_encode($output);

    //destroy Cart object
    WC()->cart->empty_cart();
    WC()->session->destroy_session();

    exit;
}

我通过发出 2 个 AJAX 请求并仅使用第二个响应来解决这个问题,但这似乎很浪费。

最佳答案

为了避免错误的计算,尝试获取购物车总计之前,我认为您需要触发 calculate_totals() 方法,例如:

// ... your code before

WC()->cart->calculate_totals(); // Trigger cart calculations

$taxes = WC()->cart->get_tax_totals(); // Get TAX calculations

// ... your code after

应该可以。


请注意,if ( WC()->cart->get_cart_contents_count() == 0 ) { 可以替换为:

if ( WC()->cart->is_empty() ) {

关于php - Woocommerce 临时购物车税未根据第一个请求正确计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77060957/

相关文章:

php - 模板中的 Symfony Action 名称

php - 帖子下方同一类别的 Wordpress 帖子

php - WordPress AJAX - 存储 jquery 变量并在 php - function.php 中回显它?

php - 如何在 woocommerce cart.php 中启用更新购物车按钮?

php - CakePHP 在不破坏 Cake 自动化的情况下自行加入 HABTM 表

php - 如何获取 curl exec 响应

javascript - 使用ajax将post数据从js发送到php而不进行类型转换

jquery - Slicknav 与 WordPress

php - 付款过程完成后更新 woocommerce 订单状态并重定向到商店

php - 如何在 WooCommerce 中创建有效的自定义产品查询?