Запретить оформление заказа в WooCommerce, если корзина содержит только «Проданные по отдельности» товары

#php #wordpress #woocommerce #cart #checkout

Вопрос:

Я использую этот код, чтобы пользователи могли добавлять товар с пользовательской ценой (по URL-адресу) в корзину. Также это делает их «Продаваемыми индивидуально».

 add_filter( 'woocommerce_add_cart_item' , 'set_woo_prices');
add_filter( 'woocommerce_get_cart_item_from_session',  'set_session_prices', 20 , 3 );
function set_woo_prices( $woo_data ) {
  if ( ! isset( $_GET['agcs'] ) || empty ( $_GET['agcs'] ) ) { return $woo_data; }
  $woo_data['data']->set_price( $_GET['agcs'] );
  $woo_data['data']->set_sold_individually('true');
  $woo_data['my_price'] = $_GET['agcs'];
  
  return $woo_data;
}

function  set_session_prices ( $woo_data , $values , $key ) {
    if ( ! isset( $woo_data['my_price'] ) || empty ( $woo_data['my_price'] ) ) { return $woo_data; }
    $woo_data['data']->set_price( $woo_data['my_price'] );
     $woo_data['data']->set_sold_individually('true');
    return $woo_data;
}
 

Потому что я использую это для повышения продаж. Мне нужен чек, который отменял бы проверку, если бы в корзине были только «Отдельно проданные» товары.

Раньше я делал это с помощью чека «Если в корзине меньше 10 долларов, то откажитесь от оформления заказа».

 add_action( 'woocommerce_check_cart_items', 'pokazimiga' );
function pokazimiga() {

    if( is_cart() || is_checkout() ) {
        global $woocommerce;
        $minimum_cart_total = 9;
        $total = WC()->cart->subtotal;
        
        
        
        if( $total <= $minimum_cart_total  ) {
            wc_add_notice( sprintf( '<strong>Nakup, manjši od %s %s ni mogoč</strong>'
                .'<br />Trenutna vrednost košarice: %s %s',
                $minimum_cart_total,
                get_option( 'woocommerce_currency'),
                $total,
                get_option( 'woocommerce_currency') ),
            'error' );
        }
    }
}
 

Было бы достаточно , если бы все товары в корзине были set_sold_individually('true') , а затем не разрешали оформлять заказ.

Комментарии:

1. Я понял это и не смог удалить:/. Извините. И спасибо вам за ваш ответ.

Ответ №1:

Следующий код предотвращает оформление заказа, если корзина содержит только «Отдельно проданные» товары.

Объяснение с помощью тегов комментариев, добавленных в код:

 function action_woocommerce_check_cart_items() {
    // Flag
    $flag = false;
    
    // Loop through cart items
    foreach( WC()->cart->get_cart() as $cart_item ) {
        // Cart contains an item that is not sold individually
        if ( ! $cart_item['data']->get_sold_individually() ) {
            // Flag becomes true
            $flag = true;
            
            // Break loop
            break;
        }
    }
    
    // When the flag is still false amp; the cart is NOT empty
    if ( ! $flag amp;amp; ! WC()->cart->is_empty() ) {
        // Clear all other notices          
        wc_clear_notices();

        // Avoid checkout displaying an error notice
        wc_add_notice( __( 'My custom error message', 'woocommerce' ), 'error' );
        
        // Optional: remove proceed to checkout button
        remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );   
    }
}   
add_action( 'woocommerce_check_cart_items' , 'action_woocommerce_check_cart_items', 10, 0 );