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

Tre*_*ner 8 php ajax wordpress datepicker woocommerce

我想要实现的目标:在woocommerce中,当用户选择日期时,我需要检查通过datepicker字段发送的日期,然后通过ajax更新送货选项,以便免费送货时可以取出不适当.

我现在知道/已经弄清楚:我目前正在触发jQuery事件并通过日期发送到自定义脚本,这是我需要做的事情.我无法在woocommerce类中找到只返回发货数据的函数,所以我不认为我可以调用它并将其作为片段返回,就像它们已经用于结账一样.

但是,我确实找到了

WC_AJAX::update_order_review()
Run Code Online (Sandbox Code Playgroud)

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

t( 'body' ).trigger( 'update_checkout' );
Run Code Online (Sandbox Code Playgroud)

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

我真正的问题是:所有这一切都很棒,我看起来正朝着正确的方向前进,但我不知道woocommerce是否足以知道如何在我的钩子动作中获取运输方法以在必要时取消它们.有谁知道我是否可以通过$ woocommerce全局对象获取它们,然后让它们被其余的WC_AJAX方法读取?

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

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

Tre*_*ner 8

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

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

通过组合使用上述调用woocommerce_checkout_update_order_review中发生的钩子,我可以参与更新结账审查块的操作.到现在为止还挺好.WC_AJAX::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().

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

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

干杯.


Dar*_*ron 5

所以特雷弗的回答对我来说并不完全有效(也许 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;
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码片段是我的代码的不完整版本,但应该能说明问题。可以通过jQuery( 'body' ).trigger( 'update_checkout' );在您的 javascript 控制台中键入来轻松测试它。

感谢特雷弗的提示。


Dáv*_*író 5

如果有人想更新购物车:

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

更改数量,然后更改回来。并且运费重新计算。

(5个多小时的代码浏览,下次我会写整个网店的代码,用一个完全可定制的好框架OMG)