Пользовательская ошибка купона в WooCommerce - Неперехваченная ошибка: вызов функции-члена get_cart () при нулевом значении

Я пытаюсь создать собственный код купона в WooCommerce с помощью PHP, который существенно снижает цену каждого товара в корзине с тегом «main» до 10. Он делает это путем подсчета количества товаров в корзине, помеченных тегом «main». ', затем вычисляет общую стоимость каждого из них, и исходя из этого рассчитывает требуемую скидку в переменной $ Discount. См. Код ниже:

$tag_name = 'main';
$tag_count = 0; 

foreach(WC()->cart->get_cart() as $cart_item)  {
    if( has_term( $tag_name, 'product_tag', $cart_item['product_id'])){
        $tag_count += $cart_item['quantity'];
        $price = $cart_item['data']->get_price();
        $float_value_price += floatval($price); 
    }
}

$discount = $float_value_price - (10*$tag_count);
$discount_string = number_format($discount, 2);


$coupon_code = 'testing'; // Code
$amount = $discount_string; // Amount
$discount_type = 'fixed_cart'; // Type: fixed_cart, percent, fixed_product, percent_product

$coupon = array(
'post_title' => $coupon_code,
'post_content' => '',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'shop_coupon');

$new_coupon_id = wp_insert_post( $coupon );

// Add meta
update_post_meta( $new_coupon_id, 'discount_type', $discount_type );
update_post_meta( $new_coupon_id, 'coupon_amount', $amount );
update_post_meta( $new_coupon_id, 'individual_use', 'no' );
update_post_meta( $new_coupon_id, 'product_ids', '' );
update_post_meta( $new_coupon_id, 'exclude_product_ids', '' );
update_post_meta( $new_coupon_id, 'usage_limit', '' );
update_post_meta( $new_coupon_id, 'expiry_date', '' );
update_post_meta( $new_coupon_id, 'apply_before_tax', 'yes' );
update_post_meta( $new_coupon_id, 'free_shipping', 'no' );



Когда я пытаюсь активировать этот код, я получаю следующее сообщение об ошибке:

Фрагмент кода, который вы пытаетесь сохранить, произвел фатальную ошибку в строке 4:

Неперехваченная ошибка: вызов функции-члена get_cart () с нулевым значением в /homepages/9/d392621230/htdocs/clickandbuilds/WOOCOMMERCEExperiment/wp-content/plugins/code-snippets/php/admin-menus/class-edit-menu.php (213): eval () 'd код: 4 Трассировка стека: # 0 / homepages / 9 / d392621230 / htdocs / clickandbuilds / WOOCOMMERCEExperiment / wp-content / plugins / code-snippets / php / admin-menus / class-edit- menu.php (213): eval () # 1 /homepages/9/d392621230/htdocs/clickandbuilds/WOOCOMMERCEExperiment/wp-content/plugins/code-snippets/php/admin-menus/class-edit-menu.php(263 ): Code_Snippets_Edit_Menu-> test_code (Object (Code_Snippet)) # 2 /homepages/9/d392621230/htdocs/clickandbuilds/WOOCOMMERCEExperiment/wp-content/plugins/code-snippets/phpmen/admin- (122): Code_Snippets_Edit_Menu-> save_posted_snippet () # 3 /homepages/9/d392621230/htdocs/clickandbuilds/WOOCOMMERCEExperiment/wp-content/plugins/code-snippets/phpmen/admin-edmin-edmin ): Code_Snippets_Edit_Menu-> process_actions () # 4 / homepages / 9 / d392621230 / htdocs / clickandbuilds / W


Я давно смотрю на это и не могу найти решения. Буду признателен, если кто нибудь сможет это решить. Спасибо.


person BillyCon    schedule 06.06.2020    source источник
comment
Никто не может решить эту проблему, так как нам нужно знать, где вы используете этот код ... В вашем вопросе отсутствует контекст: Вопрос должен быть обновлен, чтобы включить желаемое поведение, конкретную проблему или ошибку, и кратчайший код, необходимый для воспроизведения проблемы. В зависимости от того, где вы используете этот код, очевидно, что объект корзины не определен WC()->cart… Не забывайте, что корзина - это живой объект, который зарегистрирован на Сессия WC и привязана к куку в браузере клиента (на стороне клиента).   -  person LoicTheAztec    schedule 06.06.2020


Ответы (1)


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

Затем с помощью вашего кода найдите желаемые продукты и их идентификаторы. Затем вы можете передать эти идентификаторы в ранее созданный купон с помощью set_product_ids(). Не забудьте сохранить новую метаинформацию с помощью save().

Затем просто примените новый код купона к своей корзине.

Код будет выглядеть примерно так:

add_action( 'woocommerce_before_cart', 'cw_coupons_matched' );
function cw_coupons_matched() { 
    global $woocommerce;
    $coupon_code = 'your_discount_code';

    # Get product ID's
    foreach( WC()->cart->get_cart() as $cart_item ){
        var_dump($cart_item['data']->name);
        if (strpos($cart_item['data']->name, 'string_to_search') !== false) { 
            $product_ids[] = $cart_item['product_id'];
        }
    }

    # Adding product ID's to coupon
    $c = new WC_Coupon($coupon_code);
    $c->set_product_ids($product_ids);
    $c->save();

    # Adding discount coupon to cart
    if ( $woocommerce->cart->has_discount( $cw_coupon ) ) return;
    foreach ( $woocommerce->cart->cart_contents as $key => $values ) {
        if( in_array( $values['product_id'], $product_ids ) ) {
            $woocommerce->cart->add_discount( $coupon_code );
            wc_print_notices();
        }
    }

} 
person Kipras Bielinskas    schedule 06.06.2020