微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WooCommerce 根据简单和可变产品的自定义字段中的静态日期自动定期更改价格

如何解决WooCommerce 根据简单和可变产品的自定义字段中的静态日期自动定期更改价格

我的问题是基于对另一个问题“LoicTheAztec”的回答(由 XandlSet Product sale price conditionally based on custom fields in Woocommerce)提供的代码。虽然基础代码基于对这个问题的回答,但我已经进一步开发了它以满足稍微复杂的要求。

问题:对于简单产品和可变产品,我如何根据自定义字段中的静态日期自动定期更改价格?

再做一点解释;我正在尝试根据在自定义字段“wooct_time_start”中输入的静态日期创建自动降价到 WooCommerce 产品的正常价格。

下面的代码片段适用于简单的产品,目前设置为在“wooct_time_start”日期/时间之前将价格更改为“$remaining_days”的数量,但我似乎无法让代码的后半部分工作使用可变产品,这是我需要帮助的地方吗?

add_filter('woocommerce_product_get_price','conditional_product_sale_price',20,6);
add_filter('woocommerce_product_get_sale_price',6);
add_filter('woocommerce_product_variation_get_price',6);
add_filter('woocommerce_product_variation_get_sale_price',6);
add_filter('woocommerce_variation_prices_price',6);
add_filter('woocommerce_variation_prices_sale_price',6);

function conditional_product_sale_price($price,$product){
    
    if($product->is_type('simple')){

        $date = get_post_meta($product->get_id(),'wooct_time_start',true);

        if(!empty($date)){
            $date_time = (int) strtotime($date);
            $Now_time = (int) strtotime("Now");
            $remaining_days = floor(($date_time - $Now_time) / 86400);
    
            if($remaining_days <= 30){
                $price = $remaining_days;
            }elseif($remaining_days >= 31 && $remaining_days <= 60){
                $price = $remaining_days;
            }elseif($remaining_days >= 61 && $remaining_days <= 90){
                $price = $remaining_days;
            }elseif($remaining_days >= 91 && $remaining_days <= 120){
                $price = $remaining_days;
            }elseif($remaining_days >= 121 && $remaining_days <= 150){
                $price = $remaining_days;
            }elseif($remaining_days > 150){
                $price = $remaining_days;
            }
        }
        
        return $price;
            
    }if($product->is_type('variable')){

            $children_ids = $product->get_children();
            $date = get_post_meta($product->get_id(),true);
            
            foreach( $children_ids as $child_id ){

                $variation = wc_get_product($child_id);
                $var_price = $variation->get_price();
                
                if(!empty($date)){
                    $date_time = (int) strtotime($date);
                    $Now_time = (int) strtotime("Now");
                    $remaining_days = floor(($date_time - $Now_time) / 86400);
                    
                    if($remaining_days <= 30){
                        $var_price = $remaining_days;
                    }elseif($remaining_days >= 31 && $remaining_days <= 60){
                        $var_price = $remaining_days;
                    }elseif($remaining_days >= 61 && $remaining_days <= 90){
                        $var_price = $remaining_days;
                    }elseif($remaining_days >= 91 && $remaining_days <= 120){
                        $var_price = $remaining_days;
                    }elseif($remaining_days >= 121 && $remaining_days <= 150){
                        $var_price = $remaining_days;
                    }elseif($remaining_days > 150){
                        $var_price = $remaining_days;
                    }
                }
                
                return $price;
                
            }
    }   
}

我尝试了对代码的各种迭代,但都没有成功:

  • 改变行$date = get_post_meta($product->get_id(),true);的位置
  • 将行 $var_price = $variation->get_price(); 更改为 $var_price = $product->get_price();
  • 由于存储的瞬态,我已经使用了与 woocommerce_get_variation_prices_hash 相关的代码,但尽管在网上进行了几个小时的研究,我仍然不知道它与我的代码有何直接关系。

更新:

我已经能够使用文章Change product prices via a hook in WooCommerce 3+”中提供的答案创建以下更新后的代码

这个新代码还有一个问题 - 它似乎没有成功更新任何“变体”的价格。然而,它适用于“简单”和“可变”产品!

如果有人也能让这个新代码与“变体”一起工作,那么这将回答这个问题。

function product_life_cycle_main_function($price,$product){

        $date = get_post_meta($product->get_id(),true);

        if(!empty($date)){
            $date_time = (int) strtotime($date);
            $Now_time = (int) strtotime("Now");
            $remaining_days = floor(($date_time - $Now_time) / 86400);
    
            if($remaining_days <= 30){
                $price = $remaining_days;
            }elseif($remaining_days >= 31 && $remaining_days <= 60){
                $price = $remaining_days;
            }elseif($remaining_days >= 61 && $remaining_days <= 90){
                $price = $remaining_days;
            }elseif($remaining_days >= 91 && $remaining_days <= 120){
                $price = $remaining_days;
            }elseif($remaining_days >= 121 && $remaining_days <= 150){
                $price = $remaining_days;
            }elseif($remaining_days > 150){
                $price = $remaining_days;
            }
        }
        return $price;
}

add_filter('woocommerce_product_get_price','product_life_cycle_custom_price',99,2);
add_filter('woocommerce_product_get_regular_price',2);
add_filter('woocommerce_product_variation_get_regular_price',2);
add_filter('woocommerce_product_variation_get_price',2);
    function product_life_cycle_custom_price($price,$product) {
        return product_life_cycle_main_function($price,$product);
    }

add_filter('woocommerce_variation_prices_price','product_life_cycle_custom_variable_price',3);
add_filter('woocommerce_variation_prices_regular_price',3);
    function product_life_cycle_custom_variable_price($price,$variation,$product) {
        wc_delete_product_transients($variation->get_id());
        return product_life_cycle_main_function($price,$product);
    }

add_filter('woocommerce_get_variation_prices_hash','product_life_cycle_variation_prices_hash',3);
    function product_life_cycle_variation_prices_hash($price_hash,$product,$for_display) {
        $price_hash[] = product_life_cycle_main_function($price,$product);
        return $price_hash;
    }

解决方法

我建议重写获取数据的逻辑以使其更健壮。如果产品不是简单的、可变的或变异的,则接受的答案中描述的检查将失败,但可以使其更通用。以下是如何执行此操作的示例:

function product_life_cycle_main_function($price,$product){
    // Determine the product ID to use
    // - Parent product ID for variations
    // - Product ID for all other products
    $meta_product_id = $product->is_type('variation') ? $product->get_parent_id() : $product->get_id();

    // The above can also be simplified as follows:
    // - If the product has a parent,take the meta from the parent
    // - If the product doesn't have a parent,take the meta from the product
    //
    // This check would also work with other product types,such as bundled products,subscriptions,etc
    //$meta_product_id = ($product->get_parent_id() > 0) ? $product->get_parent_id() : $product->get_id();

    $date = get_post_meta($meta_product_id,'wooct_time_start',true);

    // Rest of the code...

    return $price;
}
,

使用 Diego 给出的建议,我能够添加以下内容以使代码正常工作:

function product_life_cycle_main_function($price,$product){
    
    $product_id = ($product->get_parent_id() > 0) ? $product->get_parent_id() : $product->get_id();
    
    $date = get_post_meta($product_id,true);

        if(!empty($date)){
            $date_time = (int) strtotime($date);
            $now_time = (int) strtotime("now");
            $remaining_days = floor(($date_time - $now_time) / 86400);
    
            if($remaining_days <= 30){
                $price = $remaining_days;
            }elseif($remaining_days >= 31 && $remaining_days <= 60){
                $price = $remaining_days;
            }elseif($remaining_days >= 61 && $remaining_days <= 90){
                $price = $remaining_days;
            }elseif($remaining_days >= 91 && $remaining_days <= 120){
                $price = $remaining_days;
            }elseif($remaining_days >= 121 && $remaining_days <= 150){
                $price = $remaining_days;
            }elseif($remaining_days > 150){
                $price = $remaining_days;
            }
        }
        
        return $price;
        
}

add_filter('woocommerce_product_get_price','product_life_cycle_custom_price',99,2);
add_filter('woocommerce_product_get_regular_price',2);
add_filter('woocommerce_product_variation_get_regular_price',2);
add_filter('woocommerce_product_variation_get_price',2);
    function product_life_cycle_custom_price($price,$product) {
        return product_life_cycle_main_function($price,$product);
    }

add_filter('woocommerce_variation_prices_price','product_life_cycle_custom_variable_price',3);
add_filter('woocommerce_variation_prices_regular_price',3);
    function product_life_cycle_custom_variable_price($price,$variation,$product) {
        wc_delete_product_transients($variation->get_id());
        return product_life_cycle_main_function($price,$product);
    }

add_filter('woocommerce_get_variation_prices_hash','product_life_cycle_variation_prices_hash',3);
    function product_life_cycle_variation_prices_hash($price_hash,$product,$for_display) {
        $price_hash[] = product_life_cycle_main_function($price,$product);
        return $price_hash;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。