Функция Fire при создании заказа для удаления купонов из родительской подписки

У меня есть следующая функция, я хочу, чтобы она срабатывала каждый раз, когда создается заказ на подписку.

Затем я хочу, чтобы он удалил кредитные купоны магазина из родительской подписки (поскольку заказы на продление будут содержать купон).

Я получаю сообщение об ошибке:

Сообщение PHP: Неустранимая ошибка PHP: необработанная ошибка: вызов неопределенного метода WC_Order_Item_Coupon::get_discount_type().

Где я ошибаюсь?

Правильно ли он передается в родительском элементе подписки?

   function remove_store_credit($subscription) {
    
      $coupons = $subscription->get_items( 'coupon' );
      foreach ( $coupons as $coupon ) {
        if($coupon->get_discount_type() == "smart_coupon"){
          $subscription->remove_coupon( $coupon->get_code() );
        }
      }
    
    }
    add_action('woocommerce_subscription_payment_complete','remove_store_credit',10,1);

person Rob    schedule 04.02.2021    source источник


Ответы (1)


Метод get_discount_type() принадлежит классу WC_Coupon, но не классу WC_Order_Item_Coupon.

Итак, попробуйте получить объект экземпляра WC_Coupon внутри цикла foreach элементов купона.

function remove_store_credit( $subscription ) {
    // Loop through order coupon items
    foreach ( $subscription->get_items( 'coupon' ) as $item ) {
        $coupon = new WC_Coupon( $item->get_code() ); // get an instance of the WC_Coupon Object 

        if( $coupon->get_discount_type() == "smart_coupon" ){
            $subscription->remove_coupon( $item->get_code() );
        }
    }
}
add_action('woocommerce_subscription_payment_complete', 'remove_store_credit', 10, 1);

Это должно решить эту ошибку.

person LoicTheAztec    schedule 04.02.2021
comment
Ну конечно! Спасибо за указание, теперь работает - person Rob; 04.02.2021
comment
Есть ли способ установить использование купона на 1? Я поместил это в оператор if, но, похоже, это не меняет использование update_post_meta( $coupon->get_id(), 'usage_count', '1' ); - person Rob; 04.02.2021
comment
@Rob по одному пользователю или вообще по одному? - person LoicTheAztec; 04.02.2021
comment
Один вообще, они в любом случае привязаны к конкретному пользователю по адресу электронной почты, поэтому после использования его просто нужно изменить на 1. Для него уже установлено 1 ограничение, но когда заказ выполняется, это не считается использованием, установите, если я могу установить это как запасной вариант. - person Rob; 04.02.2021
comment
Лучше попробуйте использовать переменную from $coupon (экземпляр объекта WC_Coupon): $coupon->decrease_usage_count(); и $coupon->save(); - person LoicTheAztec; 04.02.2021
comment
Я пробовал это, но неправильно понял его использование... это сработало, еще раз спасибо - person Rob; 04.02.2021