Диагностика задачи: зачем менять товар перед добавлением в корзину?
В стандартном WooCommerce форма добавления товара в корзину статична и не учитывает условия, которые могут влиять на доступность, цену или описание товара. Например, нужно показать дополнительное предупреждение, изменить текст, добавить скрытое поле для передачи данных или динамически менять параметры товара перед добавлением. Для этого подходит хук woocommerce_before_add_to_cart_button, который позволяет вставить код непосредственно перед кнопкой "Добавить в корзину".
Как подключить хук 'woocommerce_before_add_to_cart_button' и что он даёт
Хук срабатывает внутри шаблона single-product/add-to-cart/simple.php прямо перед кнопкой отправки формы. Это позволяет добавить любые HTML-элементы, JavaScript, скрытые поля или даже изменить поведение кнопки.
Пример базового подключения хука через функцию в functions.php вашей темы (желательно дочерней):
add_action('woocommerce_before_add_to_cart_button', 'add_custom_content_before_add_to_cart');
function add_custom_content_before_add_to_cart() {
echo '<p style="color: red; font-weight: bold;">Обратите внимание: на этот товар действует специальная акция!</p>';
}Как проверить работу
- Откройте страницу товара простого типа (simple product).
- Найдите перед кнопкой «Добавить в корзину» появившийся красный текст.
- Если текста нет — очистите кэш, проверьте правильность подключения функции и активность темы.
Практическое изменение параметров товара перед добавлением в корзину
Если нужно динамически добавить метаданные или изменить параметры товара (например, добавить пользовательское поле, которое затем будет доступно в заказе), можно использовать хук для вывода скрытого поля и обработчик добавления товара в корзину.
Пример добавления скрытого поля и обработки его значения:
add_action('woocommerce_before_add_to_cart_button', 'add_custom_field_before_add_to_cart');
function add_custom_field_before_add_to_cart() {
echo '<label for="custom_note">Введите заметку к заказу:</label>';
echo '<input type="text" id="custom_note" name="custom_note" />';
}
// Сохраняем значение в метаданные корзины
add_filter('woocommerce_add_cart_item_data', 'save_custom_field_cart_item_data', 10, 2);
function save_custom_field_cart_item_data($cart_item_data, $product_id) {
if (isset($_POST['custom_note'])) {
$cart_item_data['custom_note'] = sanitize_text_field($_POST['custom_note']);
}
return $cart_item_data;
}
// Отображаем в корзине и заказе
add_filter('woocommerce_get_item_data', 'display_custom_field_cart', 10, 2);
function display_custom_field_cart($item_data, $cart_item) {
if (isset($cart_item['custom_note'])) {
$item_data[] = array(
'key' => 'Заметка',
'value' => wc_clean($cart_item['custom_note'])
);
}
return $item_data;
}
// Сохраняем метаданные в заказ
add_action('woocommerce_add_order_item_meta', 'add_custom_field_order_item_meta', 10, 2);
function add_custom_field_order_item_meta($item_id, $values) {
if (!empty($values['custom_note'])) {
wc_add_order_item_meta($item_id, 'Заметка', $values['custom_note']);
}
}Проверка результата
- Откройте страницу товара, введите текст в поле "Введите заметку к заказу".
- Добавьте товар в корзину и перейдите в корзину — под товаром должна отображаться заметка.
- Оформите заказ и проверьте в админке WooCommerce — в деталях заказа в строке товара должна быть ваша заметка.
Частые ошибки и как их исправить
- Отсутствует вывод содержимого хука: проверьте, что вы редактируете правильный
functions.php, и что тема активна. Очистите кэш сайта и браузера. - Поле не сохраняется в заказе: убедитесь, что имя поля в форме совпадает с обработчиком (
$_POST['custom_note']), и что фильтрwoocommerce_add_cart_item_dataдобавляет данные в массив. - Ошибка при добавлении метаданных: начиная с WooCommerce 3.0 для добавления метаданных в заказ нужно использовать
wc_add_order_item_meta. Проверьте версию WooCommerce и совместимость. - Поле не отображается в корзине: проверьте фильтр
woocommerce_get_item_dataи наличие ключа в массиве данных товара.
Практические советы по производительности и безопасности
- Для безопасности всегда фильтруйте все входящие данные через
sanitize_text_fieldили аналогичные функции. - Не используйте глобальные переменные без проверки.
- Минимизируйте вывод HTML в хуках, избегайте избыточного кода, чтобы не замедлять загрузку страницы товара.
- Если добавляете JavaScript для динамического поведения, подключайте его через
wp_enqueue_script, чтобы избежать конфликтов.
Сравнение вариантов реализации динамического изменения товара перед «Добавить в корзину»
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_before_add_to_cart_button | Простой вывод HTML и полей, легко добавлять кастомизацию | Не изменяет логику добавления товара, только визуал | Добавление полей, предупреждений, кастомной верстки |
Фильтр woocommerce_add_cart_item_data | Позволяет менять данные товара в корзине | Требует дополнительной обработки и сохранения метаданных | Передача пользовательских данных с формы в корзину |
| JS-скрипты с AJAX | Динамические изменения без перезагрузки страницы | Сложнее в реализации, требует фронтенд навыков | Сложная логика, динамическая подгрузка данных |