如果购物车中有特定项目,如何删除WooCommerce中的WooCommerce_Checkout_Process操作挂钩

时间:2019-04-02 作者:Kanewilliam

如果购物车中有特定产品,我需要删除签出页字段验证。

插件代码:

add_action(\'woocommerce_checkout_process\', \'my_custom_checkout_field_process\');

function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST[\'developer_name\'] )
        wc_add_notice( __( \'Please fill in your name.\' ), \'error\' );
}
我需要取下这个动作钩my_custom_checkout_field_process 仅当客户将product\\u id(19)添加到购物车时。否则无需移除add_action.

2 个回复
最合适的回答,由SO网友:Chan 整理而成

在函数中尝试以下代码。php文件或插件中

add_action("init", function () {
    // removing the woocommerce hook
    foreach( WC()->cart->get_cart() as $cart_item ){
            $product_id = $cart_item[\'product_id\'];
            if($product_id!=\'19\')
            {
        remove_action(\'woocommerce_checkout_process\', \'my_custom_checkout_field_process\');
    }
}
});

SO网友:cjbj

WordPress在过程的早期,可能在product_id 是已知的。因此,您可能(我不知道WooCommerce在哪里执行此操作)无法有条件地执行此操作。

但是,您可以做的是完全删除该操作,并定义一个包含该条件的新操作。此外,您必须确保在执行旧操作之前完成此操作。像这样:

add_action (\'woocommerce_checkout_process\', \'wpse333234_change_hook\', 1); // early priority

function wpse333234_change_hook () {
  remove_action (\'woocommerce_checkout_process\', \'my_custom_checkout_field_process\'); // remove old hooked function
  add_action (\'woocommerce_checkout_process\', \'wpse333234_new_hook\', 10); // define new hooked function with later priority
  }

function wpse333234_new_hook () {
  // Check if set, if its not set add an error.
  if ( ! $_POST[\'developer_name\'] && !$product_id==19)
    wc_add_notice( __( \'Please fill in your name.\' ), \'error\' );
    }
请注意,后一个函数最初会给出错误,因为$product_id 未在函数中定义。我不知道这在WooCommerce中是如何定义的。您需要一种方法来访问此(全局?)在某种程度上是可变的。

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。