Условно скрыть поле купона на странице корзины в Woocommerce - PullRequest
1 голос
/ 05 августа 2020

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

add_filter( 'woocommerce_coupons_enabled', 'wdc_hide_coupon_field_dinner_dances' );

function wdc_hide_coupon_field_dinner_dances($enabled){ 
$wdc_category = 'discount';
$has_cat = true;

foreach ( WC()->cart->get_cart() as $cart_item_key =>$cart_item ) {
   $wdc_product = $cart_item['data'];
   $product_id = method_exists( $wdc_product, 'get_id' ) ? $wdc_product->get_id() : $wdc_product->id;
   if ( has_term( $wdc_category, 'product_cat', $product_id ) ) $has_cat = false;
   }
   if ( $has_cat && is_cart() ) {
      $enabled = false;
  }
 return $enabled;
}

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

Сведения об ошибке

=============
Ошибка типа E_ERROR была вызвана в строке 16 файла / home / westviewdance / public_html / wp-content / plugins / WdcFreeTicketCoupon-for- Woocommerce / WdcFreeTicketCoupon для Woocommerce. php.
Сообщение об ошибке: Неперехваченная ошибка: вызов функции-члена get_cart () при нулевом значении в / home / westviewdance / public_html / wp-content / plugins / WdcFreeTicketCoupon-for-Woocommerce / WdcFreeTicketCoupon
для Woocommerce. php: 16 Трассировка стека:
# 0 /home/westviewdance/public_html/wp-includes/class-wp-hook.php(287): wdc_hide_coupon_field_dinner_dances (true)
# 1 / home / westviewdance / public_html / wp -includes / plugin. php (206): WP_Hook-> apply_filters (true, Array)
# 2 / home / westviewdance / public_html / wp-content / plugins / woocommerce / includes / w c -coupon- функций. php (69): apply_filters ('woocommerce_cou ...', true)
# 3 / home / westviewdance / public_html / wp-content / plugins / woocommerce / packages / woocommerce-blocks / src / Assets. php (157): wc_coupons_enabled ()
# 4 /home/westviewdance/public_html/wp-includes/class-wp-hook.php(287): Automattic \ WooCommerce \ Blocks \ Assets :: get_wc_block_data ( Массив)
# 5 /home/westviewdance/public_html/wp-includes/plugin.php(206): WP_ Hook-> apply_filters (Array, Array)
# 6 / home / westviewdance / public_html / wp-content / plugins / woocommerce / packages / woocommerce-

1 Ответ

1 голос
/ 05 августа 2020

Попробуйте следующий упрощенный код с некоторыми проверками условий, чтобы избежать этой ошибки. Кроме того, при просмотре категорий продуктов в элементах корзины всегда используйте $cart_item['product_id'], так как это будет работать и для вариантов продукта.

add_filter( 'woocommerce_coupons_enabled', 'hide_coupon_field_dinner_dances' );
function hide_coupon_field_dinner_dances( $enabled ){ 
    $cart = WC()->cart; // The WC_Cart Object
    
    // Only on cart page
    if( is_cart() && $cart && method_exists( $cart, 'get_cart' ) ) {
        $category = array('discount'); // <= Here define the product categories
        $enabled  = false; // Only enable when this product category is in cart
        
        // Loop through cart items
        foreach ( $cart->get_cart() as $cart_item ) {
            if ( has_term( $category, 'product_cat', $cart_item['product_id'] ) )  {
                $enabled = true;
                break;
            }
        }
    }
    return $enabled;
}

Теперь это должно работать лучше, чтобы избежать проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...