Установите минимальную сумму заказа для определенных продуктов или категорий в WooCommerce

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

По сути, у меня есть два товара, которые покупатели могут добавить в свою корзину. Я хочу сделать так, чтобы они не могли оформить заказ ни с одним из этих предметов, если их промежуточная сумма не составляет 15 долларов или больше.

Было бы неплохо иметь возможность просто вставить их идентификаторы в код. Или я могу отнести их к одной категории и установить этот минимум по категориям.

Пока все, что у меня есть, это базовый PHP, который устанавливает универсальный минимум. Мне просто нужна помощь, чтобы выяснить, как ограничить это, чтобы удовлетворить мои потребности.

Я дизайнер, а не разработчик, поэтому любая помощь очень ценится.

    // Set a minimum dollar amount per order
add_action( 'woocommerce_check_cart_items', 'spyr_set_min_total' );
function spyr_set_min_total() {
    // Only run in the Cart or Checkout pages
    if( is_cart() || is_checkout() ) {
        global $woocommerce;

        // Set minimum cart total
        $minimum_cart_total = 10;

        // Total we are going to be using for the Math
        // This is before taxes and shipping charges
        $total = WC()->cart->subtotal;

        // Compare values and add an error is Cart's total
        // happens to be less than the minimum required before checking out.
        // Will display a message along the lines of
        // A Minimum of 10 USD is required before checking out. (Cont. below)
        // Current cart total: 6 USD 
        if( $total <= $minimum_cart_total  ) {
            // Display our error message
            wc_add_notice( sprintf( '<strong>A Minimum of %s %s is required before checking out.</strong>'
                .'<br />Current cart\'s total: %s %s',
                $minimum_cart_total,
                get_option( 'woocommerce_currency'),
                $total,
                get_option( 'woocommerce_currency') ),
            'error' );
        }
    }
}

person Jeff    schedule 17.05.2016    source источник


Ответы (1)


Обновление 2020 г.

Установка минимального значения для некоторых категорий товаров или идентификаторов товаров в корзине только для страниц "Корзина" и "Оформление заказа".

Этот непроверенный фрагмент состоит из этого и < a href="https://docs.woothemes.com/document/automatically-add-product-to-cart-on-visit/" rel="nofollow noreferrer">это из wooThemes и это тоже< /а>:

add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
add_action( 'woocommerce_before_cart' , 'wc_minimum_order_amount' );
 
function wc_minimum_order_amount() {
    ##  SETTINGS  ##
    $minimum_amount = 50; // Define a minimum order amount
    $category_ids   = array( 17, 18 ); // Define your category ids in the array (or an empty array to disable)
    $product_ids    = array( 64, 67, 78 ); // Define your product ids in the array (or an empty array to disable)

    // Only on cart or checkout pages
    if( WC()->cart->is_empty() || ! ( is_cart() || is_checkout() ) ) 
        return; // Exit

    $total_amount = WC()->cart->subtotal; // Items subtotal including taxes

    if ( $total_amount < $minimum_amount ) {
        $needs_minimum_amount = false; // Initializing

        // Loop through cart items
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            $product_id   = $cart_item['product_id'];
            $variation_id = $cart_item['variation_id'];
            
            // 1. Check for matching product categories
            if( sizeof($category_ids) > 0 ) {
                $taxonomy = 'product_cat';

                if ( has_term( $category_ids, $taxonomy, $product_id ) ) { 
                    $needs_minimum_amount = true;
                    break; // Stop the loop
                }
            }

            // 2. Check for matching product Ids
            if( sizeof($product_ids) > 0 ) {
                if ( array_intersect( $product_ids, array($product_id, $variation_id) ) ) { 
                    $needs_minimum_amount = true;
                    break; // Stop the loop
                }
            }
        }

        if( $needs_minimum_amount ) {
            wc_print_notice( sprintf( 
                __("You must have an order with a minimum of %s to place your order. Your current order total is %s."), 
                wc_price( $minimum_amount ), 
                wc_price( $total_amount )
            ), 'error' );
        }
    }
}

Код находится в файле functions.php вашей активной дочерней темы (активной темы). Проверено и работает.

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


— — … I m p o r t a n t … N o t e … — —

Эти крючки работают для сообщений. Но чтобы пользователи не нажимали, вам нужно добавить Javascript/jQuery и, возможно, ajax (обнаружение на стороне клиента).

person LoicTheAztec    schedule 17.05.2016
comment
Привет - большое спасибо за ваш ответ. Это отличное начало, но, к сожалению, на самом деле оно не мешает пользователю щелкнуть «Оформить заказ» и перейти к PayPal. Предупреждение отображается, но не останавливает их. Кроме того, к вашему сведению, выше была небольшая опечатка, дополнительные скобки, где идут идентификаторы продуктов. - person Jeff; 17.05.2016
comment
Хорошо спасибо. Я просто имел в виду, что для вашего сведения была опечатка. :) Я отмечу это как правильное, хотя это еще не помешает пользователю проверить. Я попытаюсь выяснить, смогу ли я понять jQuery, чтобы заблокировать это самостоятельно. Спасибо. - person Jeff; 17.05.2016
comment
Ладно, не беспокойся. Я ценю ваше время. У меня есть вопрос (и опять же, я не очень хорошо знаю PHP), но сначала я попробовал этот код и безуспешно пытался настроить его под свои нужды. Но при использовании именно так, как есть, когда вы нажимаете «Оформить заказ», он перенаправляет на страницу с ошибкой. Я вижу, что есть некоторые различия в синтаксисе между вашим кодом и их кодом, где «ошибка» ... это так же просто, как настроить конец? - person Jeff; 17.05.2016