Woocommerce 通过 ajax 在结帐时更新运输方式
Posted
技术标签:
【中文标题】Woocommerce 通过 ajax 在结帐时更新运输方式【英文标题】:Woocommerce update shipping methods in checkout via ajax 【发布时间】:2015-06-28 22:14:03 【问题描述】:我要完成的工作: 在 woocommerce 中,我需要在用户选择日期时检查通过 datepicker 字段传递的日期,然后通过 ajax 相应地更新运输选项,这样事情比如不合适的时候可以包邮。
我目前知道/已经弄清楚的:我目前正在触发 jQuery 事件并将日期发送到自定义脚本,这有点需要我做。我无法在 woocommerce 类中找到仅返回运输数据的函数,因此我认为我不能调用它并将其作为片段返回,就像他们已经为结帐所做的那样。
但是我确实发现了
WC_AJAX::update_order_review()
其中有一个动作调用,我已经成功地将一个函数挂接到该动作上,并且我已经能够触发
t( 'body' ).trigger( 'update_checkout' );
触发更新结帐审查块的操作。
我真正的问题:这一切都很好,而且我看起来正朝着正确的方向前进,但我对 woocommerce 的了解不够深入,无法知道如何获取其中的运输方式我的上钩动作在必要时取消设置它们。有谁知道我是否可以通过 $woocommerce 全局对象获取它们,然后让 WC_AJAX 方法的其余部分读取它们??
我们将不胜感激。
** 注释:是的,我知道在 jQuery 中这是一个 't' 而不是一个 '$'。没有错
【问题讨论】:
【参考方案1】:所以,对于那些可能需要这个的人来说,它需要在 woocommerce 中进行一些小技巧,因为他们处理输出购物车/结帐值以用于运输和支付选项的方式,但最终,我可以实现它使用 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()
中循环并构建运输选项。
现在,我知道,您在想,等等,我需要结帐运输方式,而不是购物车,但实际上,它们似乎是一回事。
希望我浪费的时间能帮助遇到类似问题的其他人。
干杯。
【讨论】:
谢谢。这是我能找到的唯一一个试图做这样的事情的答案。【参考方案2】:所以 Trevor 的回答对我来说并不完全有效(也许 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;
上面的 sn-p 是我的代码的不完整版本,但应该明白这一点。它可以通过在您的 javascript 控制台中输入 jQuery( 'body' ).trigger( 'update_checkout' );
轻松测试。
感谢特雷弗的提示。
【讨论】:
【参考方案3】:如果有人想更新购物车:
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的好框架)
【讨论】:
或者您可以使用 WC()->cart->calculate_shipping() 结合 woocommerce_checkout_update_order_review 挂钩,请参阅:gist.github.com/neamtua/bfdc4521f5a1582f5ad169646f42fcdf 如何使用 WC 3.0+ 本身的完整功能做到这一点?请求可以复制到functions.php的完整代码。谢谢以上是关于Woocommerce 通过 ajax 在结帐时更新运输方式的主要内容,如果未能解决你的问题,请参考以下文章
WooCommerce - 如何使用 ajax 动态加载结帐页面?
woocommerce 自定义结帐字段以增加订购 ajax 的费用
在 Woocommerce 3 中通过 ajax 提交并在结帐时创建订单