Php 在电子商务签出时禁用AJAX

Php 在电子商务签出时禁用AJAX,php,ajax,wordpress,woocommerce,Php,Ajax,Wordpress,Woocommerce,我想问一下,我如何在结帐页面(您在其中输入发货和账单信息)禁用AJAX,并通过自然刷新来更新购物车摘要,而不是使用AJAX根据您的位置来更新购物车摘要 当前,每当用户通过shipping location切换其位置时,购物车摘要将自动更新,而无需重新加载页面。我想删除AJAX,让页面重新加载更新的信息 我不太确定我应该指向什么样的代码或方向,但我准备提供任何必要的细节。让我知道!谢谢 所有WooCommerce字符串都使用wp\u localize\u script进行了适当的本地化,因此我认为

我想问一下,我如何在结帐页面(您在其中输入发货和账单信息)禁用AJAX,并通过自然刷新来更新购物车摘要,而不是使用AJAX根据您的位置来更新购物车摘要

当前,每当用户通过shipping location切换其位置时,购物车摘要将自动更新,而无需重新加载页面。我想删除AJAX,让页面重新加载更新的信息


我不太确定我应该指向什么样的代码或方向,但我准备提供任何必要的细节。让我知道!谢谢

所有WooCommerce字符串都使用
wp\u localize\u script
进行了适当的本地化,因此我认为您可以通过创建适当的.po/.mo文件来正确地翻译它们,但我承认,我在翻译方面没有太多经验。供参考:所有可用的语言包都是,您可能还需要阅读

无论如何,签出脚本都在
checkout.js
中。像任何脚本一样,只要知道句柄,就可以通过退出队列

function so_27023433_disable_checkout_script(){
    wp_dequeue_script( 'wc-checkout' );
}
add_action( 'wp_enqueue_scripts', 'so_27023433_disable_checkout_script' );

一种不禁用checkout.js的方法

首先,可能会加载checkout.min.js而不是checkout.js

然后注释这两行:

update_checkout:function(){
    //b.reset_update_checkout_timer(),
    //b.updateTimer=setTimeout(b.update_checkout_action,"5")
},

然后,您的签出页面将是免费的ajax

我遇到了一个类似的问题,我没有删除整个脚本,而是去查看事件是何时创建的,我发现了这个问题

$( document.body ).bind( 'update_checkout', this.update_checkout );
读了一点之后,我发现由于名称空间的原因,我无法解除绑定,因此我连接了
on
事件,并且由于无法阻止默认值,我停止了事件的传播

这些解决了我的问题

jQuery(document.body).on('update_checkout', function(e){
    //e.preventDefault();
    //e.stopPropagation();
    e.stopImmediatePropagation();
    //console.log(e);
});

如果遵循checkout.js源代码的逻辑,您会注意到,通过更改签出表单的类名,可以安全地禁用这些与编辑账单|发货地址相关的AJAX操作。 是的,我知道,就是这么简单。因此,不要使用
form.checkout
而是使用
form.checkout1
其中
。checkout1
只是一个虚构的类名(它不必是真实的/存在的)

下面是一个示例代码,可以帮助您了解所需的内容:

var default_class = 'checkout';
var mask_class = 'checkout1';

// hijack the form's AJAX by changing form's default class name
$('form.'+default_class).addClass(mask_class).removeClass(default_class);

// restore the original class name whenever you want it
$('form.'+mask_class).addClass(default_class).removeClass(mask_class);

请注意,这是一个没有文档记录的黑客行为。但是,他们可能随时更改签出表单功能,因此请记住这一点。我可以确认它在WC 2.6.14上运行,可能也在早期版本中运行。

我们遇到了一个类似的问题:在一个时间点加载了签出脚本。再次通过另一个插件加载的脚本()

我们的解决方案更加明确:

  • 在页面上配置自定义字段,则不希望加载签出脚本
除此之外:

add_action('wp_enqueue_scripts', 'myprefix_dequeue_woocommerce_checkout', 10000);

function myprefix_dequeue_woocommerce_checkout() {
  if (get_post_meta(get_the_ID(), 'disable_woocommerce_checkout_scripts')) {
    wp_dequeue_script('wc-checkout');
    wp_dequeue_script('wc-gzd-checkout');
    wp_dequeue_script('wc-gzdp-checkout');
  }
}

为什么要删除Ajax?在Woocommerce->Settings->Products->Add to cart下有一个部分可以禁用Ajax,但它可能不是您想要的。@Robert Lee我正试图删除Ajax,因为它会覆盖我的翻译。我一直在寻找通过AJAX更新的内容每次都被翻译的方法,因此,我宁愿删除它,让页面重新加载每次翻译的正确内容。不幸的是,使用您提到的方法禁用AJAX只会在向购物车添加产品时禁用AJAX。当您将脚本登入队列时会发生什么情况?它不会在前端加载。参考法典的文章,这是个好主意。希望您的事件在WC默认事件之前触发,否则我认为e.stopImmediatePropagation将停止剩余的钩住函数,但不会停止已经执行的函数。显然,您可以检查WC钩住其功能的那一刻,并且您可以更早地钩住您的功能。因此,是的,我认为它会起作用。这种方法还有一点:确保在body.checkout\u错误上还原默认类,否则可能会遇到JS错误,因为checkout.JS的submit\u error函数将计算$('form.checkout').offset()我不知道这是否有效,但在第三方库(如插件)中编辑代码是一种糟糕的做法。它可能会产生意想不到的结果,通常会大大增加维护时间,并在标准更新过程中丢失。