wordpress woocommerce_update_product action -每次产品更新只触发一次

3hvapo4f  于 5个月前  发布在  WordPress
关注(0)|答案(5)|浏览(66)

有什么方法可以让woocommerce_update_product操作只触发一次?
我读到过它会触发两次,因为它需要在内部保存一次,以检索图像/变体保存的ID。
但从开发人员的经验来看,我想这真的不是最需要的。
到目前为止,我发现的唯一解决方法是直接在钩子中添加操作并删除它:

add_action('woocommerce_update_product', 'my_product_update', 10, 2);
function my_product_update($product_id, $product){
    remove_action('woocommerce_update_product');
    // We'll get here only once!
}

字符串
然而,当尝试批量编辑时,这会中断,使得钩子只为第一个产品触发(因为它会在之后被删除!)。
还有什么方法可以解决这个问题?
谢谢你,谢谢

hs1rzwqc

hs1rzwqc1#

也许使用WordPress Transient可以帮助。

add_action('woocommerce_update_product', 'my_product_update', 10, 2);
function my_product_update($product_id, $product) {

    $updating_product_id = 'update_product_' . $product_id;
    if ( false === ( $updating_product = get_transient( $updating_product_id ) ) ) {
        // We'll get here only once! within 2 seconds for each product id;
        // run your code here!
        set_transient( $updating_product_id , $product_id, 2 ); // change 2 seconds if not enough
    }
}

字符串

gkl3eglg

gkl3eglg2#

使用全局变量在内存中执行此操作,无需数据库条目:

add_action('woocommerce_update_product', 'my_product_update', 10, 2);
function my_product_update($product_id, $product){
    global $previous_product_id;
    if ($previous_product_id === $product_id){
        // We'll get here only once (per product)!
    }
    $previous_product_id = $product_id;
}

字符串

9rnv2umw

9rnv2umw3#

我遇到了同样的问题(实际上我的钩子被触发了5次)。我在最后一条评论中找到了下面的page解决方案。
即使用:

$times = did_action('woocommerce_update_product');
if( $times === 1){
    //  Do some stuff
}

字符串

qrjkbowd

qrjkbowd4#

更简单的解决方案是设置一个$_POST变量,并在函数开始时进行检查。

add_action( 'woocommerce_update_product', 'my_action', 10, 1 );
function my_action(){
   if( isset($_POST['action_performed']) ){
      //Prevent running the action twice
      return;
    }
   
   // do you stuff here

   $_POST['action_performed'] = true;
}

字符串

hec6srdp

hec6srdp5#

一个简单快速的解决方案是使用debug_backtrace()php函数。第一次触发使用debug_backtrace()[8]['class'] === "WC_Meta_Box_Product_Data"。第二次使用(debug_backtrace()[8]['class'] === "WC_Meta_Box_Product_Images"

add_action( 'woocommerce_update_product', 'ml_update_product'));

public function ml_update_product($product_id)
{
    if(debug_backtrace()[8]['class'] === "WC_Meta_Box_Product_Images"){
    // Your code firing once
    }
}

字符串
也许不是最好的解决方案,因为它可以在未来随着Woocommerce更新而改变,但肯定是最快,最简单的解决方案。

相关问题