You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce代码设置促销日期后不显示促销价问题求助

WooCommerce代码设置促销日期后促销价不显示的解决方案

你的问题出在:仅通过$product->save()保存促销日期时,WooCommerce没有触发手动保存产品时的完整逻辑——比如清除产品缓存、执行价格同步、触发核心更新钩子,导致前端无法正确读取促销状态下的价格。

以下是修改后的代码,加入了模拟手动保存的关键步骤:

function mysalesdates( $product, $sale_start, $sale_end ) { 
  if ( ! is_a( $product, 'WC_Product' ) ) {
    $product = wc_get_product( $product );
  }

  if ( ! $product ) {
    return false;
  }

  // 设置促销起止日期
  $product->set_date_on_sale_from( $sale_start );
  $product->set_date_on_sale_to( $sale_end );
  
  // 保存产品基础数据
  $product->save();

  // 清除产品缓存,确保前端获取最新状态
  wc_delete_product_transients( $product->get_id() );

  // 触发产品更新钩子,执行WooCommerce内部价格同步逻辑
  do_action( 'woocommerce_update_product', $product->get_id() );

  // 处理可变产品:同步所有子变体的促销日期设置
  if ( $product->is_type( 'variable' ) ) {
    foreach ( $product->get_children() as $variation_id ) {
      $variation = wc_get_product( $variation_id );
      if ( $variation ) {
        $variation->set_date_on_sale_from( $sale_start );
        $variation->set_date_on_sale_to( $sale_end );
        $variation->save();
        wc_delete_product_transients( $variation_id );
        do_action( 'woocommerce_update_product', $variation_id );
      }
    }
  }

  return true;
}

$sale_start = strtotime("01 Jul 2024"); 
$sale_end = strtotime("31 July 2024");
// $myproduct_id 已从其他函数获取
$product_saledates = mysalesdates($myproduct_id, $sale_start, $sale_end);

关键步骤说明

  • wc_delete_product_transients():删除产品的临时缓存数据,避免前端读取到旧的价格和促销状态。
  • do_action('woocommerce_update_product', $product_id):触发WooCommerce产品更新的核心钩子,这个动作会触发系统执行价格计算、数据同步等手动保存时的默认逻辑。
  • 可变产品处理:如果是可变产品,必须为每个子变体单独设置促销日期,否则变体的价格不会同步更新。

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:37:04