WooCommerce通过到期日期和时间验证优惠券

雨果1280

我正在使用woocommerce,不仅要通过默认的内置到期日期检查来验证优惠券,还要验证到期时间。

我在优惠券中添加了一个自定义字段,可用于设置到期时间。

我编写了以下代码片段,以覆盖validate_coupon_expiry_date类WC_Discounts中的默认方法

  class WC_My_plugin_Discounts extends WC_Discounts
  {
    // override validate_coupon_expiry_date to include expiry time:
    protected function validate_coupon_expiry_date($coupon)
    {
      $expiry_date = date('Y-m-d', $coupon->get_date_expires()->getTimestamp());
      // I add a custom field `expiry_time` in postmeta table:
      $expiry_time = $coupon->get_meta('expiry_time');

      $dateTime = new DateTime($expiry_date . $expiry_time);

      if ($coupon->get_date_expires() && apply_filters('woocommerce_coupon_validate_expiry_date', time() > $dateTime, $coupon, $this)) {
        throw new Exception(__('This coupon has expired.', 'woocommerce'), 107);
      }

      return true;
    }
   }

然后,我尝试使用以下代码段验证优惠券:

add_filter('woocommerce_coupon_is_valid', array($this, 'validate_coupon'), 15, 2);
function validate_coupon($valid, $coupon)
{
   $cart = WC()->cart;
   $discounts = new WC_My_plugin_Discounts($cart);

   // is_coupon_value is a public method in class WC_Discounts; and this method will run the protected 
   // method validate_coupon_expiry_date:
   $valid = $discounts->is_coupon_valid($coupon);
   
   return $valid;
}

问题:

当我通过在前端购物车页面中应用优惠券来测试代码,并尝试使用调试器检查上述代码时,我注意到回调validate_coupon实际上没有运行。我是否使用了错误的筛选器挂钩,因此未触发任何事件?我写错代码了吗?任何人都可以在此分享任何想法吗?多谢。

LoicTheAztec

这可以以更简单和有效的方式进行。您可以改用以下内容:

add_filter( 'woocommerce_coupon_validate_expiry_date', 'filter_coupon_validate_expiry_date', 10, 3 );
function validate_coupon( $valid, $coupon, $discount ) {
    $expiry_date     = $coupon->get_date_expires();
    $expiry_time     = $coupon->get_meta('expiry_time'); // Coupon custom field 

    if ( $expiry_date && ! empty($expiry_time) ) {
        $timezone        = $coupon->get_date_expires()->getTimezone(); // get timezone
        $expiry_datetime = new WC_DateTime( $expiry_date->date('Y-m-d') . ' ' . $expiry_time );
        $now_datetime    = new WC_DateTime();
    
        $expiry_datetime->setTimezone( $timezone ); // set time zone
        $now_datetime->setTimezone( $timezone ); // set time zone 
        
        $valid = $now_datetime->getTimestamp() > $expiry_datetime->getTimestamp();
    }
    return $valid;   
}

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试和工作。

对于使用带有方法和函数的Class的插件,您将替换:

add_filter( 'woocommerce_coupon_validate_expiry_date', 'filter_coupon_validate_expiry_date', 10, 3 );

和:

add_filter( 'woocommerce_coupon_validate_expiry_date', array($this, 'filter_coupon_validate_expiry_date'), 10, 3 );

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过 URL 添加 WooCommerce 优惠券

来自分类Dev

php date()和到期日期()

来自分类Dev

到期日期和页面刷新

来自分类Dev

通过curl和preg_match问题获取域到期日期/注册日期

来自分类Dev

通过curl和preg_match问题获取域到期日期/注册日期

来自分类Dev

kerberos 身份验证后凭据缓存中的开始和到期日期错误

来自分类Dev

使用before_create Rails 4设置到期日期和时间

来自分类Dev

Angular的到期日期

来自分类Dev

到期日期时间戳记为字符串

来自分类Dev

将频率(与时间相关)转换为日期(到期日)

来自分类Dev

从给定的时间段计算到期日期

来自分类Dev

显示优惠券说明woocommerce

来自分类Dev

域到期日期和重定向

来自分类Dev

WSO2 API管理器(1.9.0)-通过cURL设置到期日期/有效时间

来自分类Dev

WooCommerce:手动验证优惠券用户电子邮件

来自分类Dev

WooCommerce智能优惠券覆盖“可用优惠券”位置

来自分类Dev

从WooCommerce获取优惠券描述以订购已应用的优惠券

来自分类Dev

使用优惠券简码形式检查优惠券是否在WooCommerce中应用

来自分类Dev

TinyMce4到期日期

来自分类Dev

未设置Cookie的到期日期

来自分类Dev

检查Active Directory到期日期

来自分类Dev

Cookie 到期日期等于 -1

来自分类Dev

訂閱到期日期

来自分类Dev

解析 REST 令牌到期日期

来自分类Dev

从WooCommerce订单中获取二手优惠券代码和相关折扣金额

来自分类Dev

在WooCommerce感谢页面中显示优惠券使用次数和限制

来自分类Dev

从WooCommerce订单中获取二手优惠券代码和相关折扣金额

来自分类Dev

Woocommerce:特定产品的强制性优惠券

来自分类Dev

woocommerce以编程方式应用优惠券错误

Related 相关文章

热门标签

归档