Всплывающее окно Lightbox при действии add_to_cart в WooCommerce
Я хотел бы создать модальное "всплывающее" окно в WooCommerce, которое появляется при нажатии кнопки "Добавить в корзину". Это должно происходить после действий WC, которые фактически добавляют товар в корзину, но до/вместо каких-либо перенаправлений.
Я нашел несколько вероятных/возможных хуков, действий и фильтров, которые могут быть полезны, но я не уверен, какие именно мне нужны и как их правильно использовать (извините, я полный новичок в WooCommerce):
woocommerce_template_loop_add_to_cart
woocommerce_template_single_add_to_cart
woocommerce_after_add_to_cart_button
- также есть фильтр
add_to_cart_redirect
для $url
Я также не уверен, как фактически запустить появление лайтбокса из PHP! (В HTML я использую элемент, например, гиперссылку, по которой нужно кликнуть, но как вызвать то же самое в определенный момент выполнения PHP? -- Нужен ли мне AJAX?)
В последнюю очередь я планировал использовать ThickBox, так как он поставляется в комплекте с WordPress. Есть ли причины избегать его или есть лучшая доступная альтернатива, или может быть в WooCommerce уже есть встроенная реализация лайтбокса?
Заранее благодарен за любую помощь!
Следующее решение работает для меня на страницах архивов товаров (это включает как главную страницу магазина, так и страницы архивов категорий товаров).
Оно будет показывать текущее содержимое корзины в thickbox (всплывающем окне). Я выбрал отображение этого в данном примере просто потому, что это данные, которые возвращаются через Ajax после нажатия кнопки "добавить в корзину", но вы можете показывать другой вид информации в своем окне. Например, вы можете получить product_id только что добавленного товара, посмотрев на окружающие HTML-элементы.
В файле functions.php вашей темы (или в определении класса темы, если он у вас есть), вероятно, есть какая-то функция 'enqueue_scripts'. Вам следует добавить это в эту функцию, чтобы убедиться, что скрипт thickbox загружается.
if (is_woocommerce() && is_archive()) {
wp_enqueue_script( 'frontend-custom', get_template_directory_uri() . '/js/frontend-custom.js', array("jquery"));
add_thickbox();
}
В файле (в директории вашей темы) js/frontend-custom.js (или там, где у вас хранится JavaScript темы):
jQuery(document).ready(function($) {
$('body').on('added_to_cart',function(e,data) {
//alert('Added ' + data['div.widget_shopping_cart_content']);
if ($('#hidden_cart').length == 0) { //добавляем содержимое корзины только один раз
//$('.added_to_cart').after('<a href="#TB_inline?width=600&height=550&inlineId=hidden_cart" class="thickbox">View my inline content!</a>');
$(this).append('<a href="#TB_inline?width=300&height=550&inlineId=hidden_cart" id="show_hidden_cart" title="<h2>Корзина</h2>" class="thickbox" style="display:none"></a>');
$(this).append('<div id="hidden_cart" style="display:none">'+data['div.widget_shopping_cart_content']+'</div>');
}
$('#show_hidden_cart').click();
});
});
Дополнительные примечания:
Я полагаю, вы также можете выводить JavaScript непосредственно в страницу из PHP. В этом случае, вероятно, вам нужно использовать хук
add_action('woocommerce_ajax_added_to_cart', 'myfunction');
Это действие выполняется внутриwoocommerce_ajax_add_to_cart()
сразу после добавления товара в корзину (после прохождения валидации и т.д.), но перед перенаправлением.Страницы отдельных товаров работают не так же (кнопка "добавить в корзину" там использует обычную PHP-форму, без Ajax).
Я не тестировал это, но WooCommerce поставляется со своим собственным 'prettyphoto.js', который работает путем добавления 'rel="prettyPhoto"' к ссылке href, почти так же, как работает класс thickbox в примере выше. Возможно, вы захотите попробовать его, чтобы сохранить единообразие дизайна с WooCommerce.

Вау, спасибо за такой блестящий ответ, это идеально!! -- Я пробовал prettyPhoto, но обнаружил, что сложно изменить размеры в CSS, не меняя при этом размеры всплывающих окон галереи (хотя, оглядываясь назад, немного jQuery могло бы это исправить!) -- в любом случае, еще раз спасибо!! :)
