Уведомление о предзаказе для отсутствующих товаров

Уведомление о предзаказе Woocommerce

Ситуация: товара нет в наличии, но его можно предзаказать. Стандартное поведение Woocommerce в этом случае — надпись «Может быть предзаказано». Звучит расплывчато. Если формулировка может быть неверно понята клиентом, она будет неверно понята.

В моём случае такой товар — ароматические свечи. Да, заказать их можно, но срок производства у них от двух недель. Нужно было уведомить об этом клиентов, чтобы они точно понимали, когда заказ будет готов к отправке. Выводить сообщение об этом решил и на странице товара, и в корзине. На тот случай, если товар будет добавлен со страницы каталога и уведомление клиент не увидит. А мимо корзины ему не пройти.

С помощью ChatGPT я наваял два сниппета и добавил в functions.php.

Код для вывода уведомления на странице товара

Поскольку мне нужно было выводить такое уведомление только для определённого типа товаров, я добавил проверку категории. Также ввёл глобальную переменную, в которую записываю дату следующей поставки. Вы можете удалить и проверку категории, и глобальную переменную.

//Глобальная переменная для даты поставки
global $candle_ready_date;
$candle_ready_date = '3 июня';

function mbl_preorder_message( $availability, $product ) {
	global $candle_ready_date;
	
    // Перечисляем id целевых категорий
    $target_categories = array(1, 2); // Замените 1 и 2 на реальные ID категорий. Можно оставить только одну
    
    // Получаем категории продукта
    $categories = $product->get_category_ids();

    // Проверяем, принадлежит ли товар одной из целевых категорий
    $is_in_target_category = !empty(array_intersect($categories, $target_categories));

    // Проверяем, является ли товар предзаказом
    if ( $is_in_target_category && $product->is_on_backorder() ) {
        $availability = '<p class="stock out-of-stock">Нет в наличии. Можно оформить предзаказ</p>';
        $availability .= '<div class="preorder-message">Следующая партия будет готова <strong>' . $candle_ready_date . '</strong>. По&nbsp;готовности мы передадим заказ в&nbsp;службу доставки.</div>';
    }
    
    return $availability;
}

add_filter( 'woocommerce_get_availability_text', 'mbl_preorder_message', 10, 2 );

Если вам не нужно проверять категорию и не нужна глобальная переменная, код будет такой:

function mbl_preorder_message( $availability, $product ) {

    // Проверяем, является ли товар предзаказом
    if ( $product->is_on_backorder() ) {
        $availability = '<p class="stock out-of-stock">Нет в наличии. Можно оформить предзаказ</p>';
        $availability .= '<div class="preorder-message">Следующая партия будет готова <strong> 3 июня</strong>. По&nbsp;готовности мы передадим заказ в&nbsp;службу доставки.</div>';
    }
    
    return $availability;
}

add_filter( 'woocommerce_get_availability_text', 'mbl_preorder_message', 10, 2 );

Код для вывода уведомления на странице корзины

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

// Проверяем, что открыта страница корзины WooCommerce
add_action( 'woocommerce_before_cart', 'check_cart_inventory' );

function check_cart_inventory() {
	global $candle_ready_date;
    // Получаем объект корзины
    $cart = WC()->cart;

    // Получаем товары из корзины
    $cart_items = $cart->get_cart();

    // Список категорий для проверки запасов
    $categories_to_check = array( '1, 2' ); // Замените на ID ваших категории

    // Массив для хранения товаров, которые добавлены в корзину больше, чем есть в наличии
    $out_of_stock_items = array();

    // Перебираем товары в корзине
    foreach ( $cart_items as $cart_item_key => $cart_item ) {
        // Получаем ID товара
        $product_id = $cart_item['product_id'];

        // Получаем объект товара
        $product = wc_get_product( $product_id );

        // Проверяем, является ли товар из категории, которую нужно проверить, и включено ли управление запасами
        if ( has_term( $categories_to_check, 'product_cat', $product_id ) && $product->managing_stock() ) {
            // Получаем количество товара в наличии
            $stock_quantity = $product->get_stock_quantity();

            // Получаем количество товара в корзине
            $cart_quantity = $cart_item['quantity'];

            // Если количество товара в корзине больше, чем количество товара в наличии
            if ( $cart_quantity > $stock_quantity ) {
                // Добавляем информацию о товаре в массив
                $out_of_stock_items[] = $product->get_name() . ' (в&nbsp;наличии&nbsp;' . $stock_quantity . ')';
            }
        }
    }

    // Если товаров добавлено в корзину больше, чем есть в наличии
    if ( ! empty( $out_of_stock_items ) ) {
        // Выводим уведомление
        echo '<div class="preorder-message">';
        echo '<strong>Товары, которые оформляются предзаказом:</strong> ' . implode( ', ', $out_of_stock_items );
		echo '. Напоминаем, что срок готовности новой партии&nbsp;— <strong>' . $candle_ready_date . '.</strong> Мы отправим вам заказ сразу по&nbsp;готовности.';
        echo '</div>';
    }
}

И код без проверки категории:

// Проверяем, что открыта страница корзины WooCommerce
add_action( 'woocommerce_before_cart', 'check_cart_inventory' );

function check_cart_inventory() {
    // Получаем объект корзины
    $cart = WC()->cart;

    // Получаем товары из корзины
    $cart_items = $cart->get_cart();

    // Массив для хранения товаров, которые добавлены в корзину больше, чем есть в наличии
    $out_of_stock_items = array();

    // Перебираем товары в корзине
    foreach ( $cart_items as $cart_item_key => $cart_item ) {
        // Получаем ID товара
        $product_id = $cart_item['product_id'];

        // Получаем объект товара
        $product = wc_get_product( $product_id );

        // Проверяем, включено ли управление запасами
        if ( $product->managing_stock() ) {
            // Получаем количество товара в наличии
            $stock_quantity = $product->get_stock_quantity();

            // Получаем количество товара в корзине
            $cart_quantity = $cart_item['quantity'];

            // Если количество товара в корзине больше, чем количество товара в наличии
            if ( $cart_quantity > $stock_quantity ) {
                // Добавляем информацию о товаре в массив
                $out_of_stock_items[] = $product->get_name() . ' (в&nbsp;наличии&nbsp;' . $stock_quantity . ')';
            }
        }
    }

    // Если товаров добавлено в корзину больше, чем есть в наличии
    if ( ! empty( $out_of_stock_items ) ) {
        // Выводим уведомление
        echo '<div class="preorder-message">';
        echo '<strong>Товары, которые оформляются предзаказом:</strong> ' . implode( ', ', $out_of_stock_items );
		echo '. Напоминаем, что срок готовности новой партии&nbsp;— <strong>3 июня</strong>. Мы отправим вам заказ сразу по&nbsp;готовности.';
        echo '</div>';
    }
}
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии