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