Что такое хук woocommerce_before_add_to_cart_button и для чего он нужен?
Хук woocommerce_before_add_to_cart_button позволяет вставлять дополнительный HTML или выполнять PHP-код непосредственно перед кнопкой «Добавить в корзину» на странице товара WooCommerce. Это удобное место для добавления кастомных элементов, динамического контента или изменения отображения товара без изменения шаблонов темы.
Пример использования
Например, можно вывести предупреждение или дополнительную информацию, основываясь на свойствах товара:
add_action('woocommerce_before_add_to_cart_button', function() {
global $product;
if ( $product->is_on_sale() ) {
echo '<p style="color:red; font-weight:bold;">Акция! Успей купить дешевле!</p>';
}
});Диагностика: почему в моём кастоме не отображается информация перед кнопкой «Добавить в корзину»?
Если код с хуком не сработал, проверьте:
- Используется ли стандартный шаблон WooCommerce для страницы товара? Многие темы переопределяют шаблоны, где этот хук может отсутствовать.
- Не конфликтует ли ваш код с другими плагинами или функциями, отключающими стандартные хуки.
- Правильно ли подключён ваш код: в
functions.phpили собственном плагине, и нет ли ошибок PHP, прерывающих выполнение. - Отображается ли страница товара (single product) — хук срабатывает только там.
Пошаговое решение: добавление динамического контента перед кнопкой «Добавить в корзину»
- Откройте
functions.phpвашей дочерней темы или создайте собственный плагин. - Добавьте следующий код, который выводит сообщение, если цена товара выше 10000 рублей:
add_action('woocommerce_before_add_to_cart_button', function() {
global $product;
if ( $product->get_price() > 10000 ) {
echo '<div style="padding:10px; background:#f0f0f0; margin-bottom:10px; border:1px solid #ccc;">Товар относится к премиальному сегменту.</div>';
}
});- Сохраните изменения и обновите страницу товара.
- Проверьте, что сообщение появилось непосредственно перед кнопкой «Добавить в корзину».
Расширенный пример: добавление пользовательского поля с выбором опции
Можно добавить селект с вариантами выбора, который изменяет цену товара в корзине при добавлении:
add_action('woocommerce_before_add_to_cart_button', function() {
echo '<label for="custom_option">Выберите опцию:</label>';
echo '<select name="custom_option" id="custom_option">
';
echo '<option value="standard">Стандарт</option>
';
echo '<option value="premium">Премиум (+500 руб)</option>
';
echo '</select>';
});
// Добавляем выбранную опцию к товару в корзине
add_filter('woocommerce_add_cart_item_data', function($cart_item_data, $product_id, $variation_id) {
if ( isset($_REQUEST['custom_option']) ) {
$cart_item_data['custom_option'] = sanitize_text_field($_REQUEST['custom_option']);
$cart_item_data['unique_key'] = md5(microtime().rand()); // чтобы товар с разными опциями не сливался
}
return $cart_item_data;
}, 10, 3);
// Изменяем цену в корзине в зависимости от опции
add_action('woocommerce_before_calculate_totals', function($cart) {
if ( is_admin() && ! defined('DOING_AJAX') ) return;
foreach ( $cart->get_cart() as $cart_item ) {
if ( isset($cart_item['custom_option']) && $cart_item['custom_option'] === 'premium' ) {
$price = $cart_item['data']->get_price();
$cart_item['data']->set_price( $price + 500 );
}
}
});Проверка результата после внедрения
- Откройте страницу товара, проверьте появление добавленного блока или селекта непосредственно перед кнопкой «Добавить в корзину».
- Если добавляли опцию, выберите её и добавьте товар в корзину.
- Перейдите в корзину и убедитесь, что цена изменилась в соответствии с выбранной опцией.
- Включите WP_DEBUG и проверьте отсутствие ошибок PHP.
Частые ошибки и способы их исправления
- Хук не срабатывает: тема использует кастомный шаблон товара без вызова
do_action('woocommerce_before_add_to_cart_button'). Проверьте шаблонsingle-product/add-to-cart/simple.phpили дочернюю тему. - Данные формы не передаются: отсутствует поле
nameу элементов формы или форма не обрабатывается WooCommerce. Убедитесь, что поля имеют уникальныеnameи не конфликтуют с другими плагинами. - Изменение цены не применяется: не добавлен фильтр
woocommerce_before_calculate_totalsили цена сбрасывается. Проверьте логику изменения и вызов методов объекта товара. - Товар с разными опциями сливается в корзине: не добавлен уникальный ключ
unique_keyв массив данных корзины. Добавьте его, чтобы WooCommerce воспринимал товары как разные позиции.
Практические советы по безопасности и производительности
- Всегда очищайте пользовательские данные с помощью
sanitize_text_fieldили аналогичных функций. - Не перегружайте хук тяжелыми запросами или сложной логикой — это может замедлить загрузку страницы товара.
- Для сложных кастомизаций используйте отдельный плагин, чтобы не потерять изменения при обновлении темы.
- Тестируйте изменения в безопасной среде, чтобы избежать сбоев на рабочем сайте.
Сравнение способов добавления кастомного контента перед кнопкой «Добавить в корзину»
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_before_add_to_cart_button | Простой, не требует копирования шаблонов, сохраняет совместимость | Зависит от темы (хук может отсутствовать), ограничен местом вставки | Для вставки небольших блоков и форм |
Переопределение шаблона add-to-cart/simple.php | Полный контроль над выводом кнопки и окружением | Требует поддержки при обновлениях WooCommerce и темы | При необходимости радикальной кастомизации формы |
| Использование плагина для кастомизации | Чистота кода, переносимость, удобство управления | Зависимость от стороннего плагина, возможные конфликты | Для сложных и часто меняющихся настроек |