首页 文章

Woocommerce通过ajax更新结账时的送货方式

提问于
浏览
7

What i'm trying to accomplish: 在woocommerce中,当用户选择日期时,我需要检查通过datepicker字段发送的日期,然后通过ajax相应地更新送货选项,以便在不合适时可以取出免费送货之类的东西 .

What I currently know/have figured out: 我目前正在触发jQuery事件并通过日期发送到自定义脚本,这是我需要做的事情 . 我无法在woocommerce类中找到只返回发货数据的函数,因此我认为我不能将其作为片段返回并将其作为片段返回,就像它们已经用于结账一样 .

但是,我确实找到了

WC_AJAX::update_order_review()

在其中有一个动作调用,我已经成功地将一个函数挂钩到该动作上,并且我已经能够触发该动作

t( 'body' ).trigger( 'update_checkout' );

它会触发更新结帐审核块的操作 .

My real question: 所有这一切都很棒,而且我很了解woocommerce,知道如何在我的钩子动作中获取运输方法,以便在必要时取消它们 . 有谁知道我是否可以通过$ woocommerce全局对象获取它们,然后让它们被其余的WC_AJAX方法读取?

这里的任何帮助将不胜感激 .

**注意:是的,我知道jQuery中的't'而不是'$' . 不是一个错误

3 回答

  • 7

    因此,对于那些可能需要这些的人来说,它需要在woocommerce中进行一些尝试,因为他们处理运输和支付选项的购物车/结账 Value 的输出方式,但最终,我可以使用woocommerce的钩子来实现它,以及非常少的插件修改,所以,一个非常干净的解决方案 .

    基本上我所做的是使用woocommerce会话,两个钩子和一个刷新结账订单审查的javascript触发器 .

    通过 WC_AJAX::update_order_review 中发生的 woocommerce_checkout_update_order_review 钩子和使用前面提到的 $( 'body' ).trigger( 'update_checkout' ); 调用的组合,我可以参与更新结账审查块的操作 . 到现在为止还挺好 .

    我在这个函数中所做的是检查字段是否有值,如果有,则将其保存在 WC()->session 中 . 然后,自 WC_AJAX::update_order_review 调用 woocommerce_order_review() 以获取所有更新的购物车和运输方法后,我查看了与该功能相关的模板并找到了另一个钩子 woocommerce_review_order_before_shipping ,它允许我在购物车模板循环之前修改运输方法并构建运输 wc_cart_totals_shipping_html() 中的选项 .

    现在,我知道,你在想,等等,我需要结账运输方法,而不是购物车,但实际上,它们似乎是同一个 .

    希望我浪费的时间会帮助其他有类似问题的人 .

    干杯 .

  • 4

    因此,特雷弗的回答对我来说并不完全有效(也许WC自制作以来已经改变了),但确实让我朝着正确的方向前进 .

    我使用了一些略有不同的滤镜 . 我需要解决的问题是根据自定义字段添加/删除某些送货选项 .

    add_action('woocommerce_checkout_update_order_review', function ($rawFields) {
                // This function checks for the value of my custom field on the checkout page.
                parse_str($rawFields, $checkoutFields);
                $this->myField = $checkoutFields['my_field'] ?? null;
    });
    
    add_filter('woocommerce_shipping_packages', 'modifyShippingPackages']);
    
    public function modifyShippingPackages($packages)
        {
            if ($this->myField) {
                //.. modify $packages. In my case, I had to remove shipping methods.
                $rates = $packages[0]['rates'];
    
                $newRates = array_filter($rates, function ($shippingRate)
                {
                    // figure out what should be in the rates
                });
    
                $packages[0]['rates'] = $newRates;
    
                $session = WC()->session;
                $session->set('shipping_method_counts', [count($newRates)]);
                $session->set('chosen_shipping_methods', [$newRates[0]->id]);
            }
    
            return $packages;
        }
    

    上面的代码片段是我的代码的不完整版本,但应该得到重点 . 在javascript控制台中输入 jQuery( 'body' ).trigger( 'update_checkout' ); 可以轻松测试它 .

    感谢Trevor的提示 .

  • 2

    如果有人想更新购物车:

    foreach (WC()->cart->get_cart() as $key => $value) {
        WC()->cart->set_quantity($key, $value['quantity']+1);
        WC()->cart->set_quantity($key, $value['quantity']);
        break;
    }
    

    更改数量然后更改回来 . 并且运输重新计算 .

    (超过5个小时的代码浏览,下次我将编写整个网店,只需使用一个好的框架和完全可定制的OMG)

相关问题