Хук для кнопки AJAX-добавления в корзину?

20 июн. 2012 г., 00:14:54
Просмотры: 32.4K
Голосов: 6

Кто-нибудь сталкивался с необходимостью добавить кнопку AJAX-добавления в корзину (ту, что находится в архиве товаров) для вывода товаров из пользовательского запроса?

Не могли бы вы поделиться нужным хуком? Я никак не могу найти правильный.

2
Комментарии

Вы не думали задать этот вопрос на форумах поддержки WooCommerce?

EAMann EAMann
20 июн. 2012 г. 00:16:30

Да, но по моему опыту StackExchange всегда отвечает быстрее.

Anriëtte Myburgh Anriëtte Myburgh
20 июн. 2012 г. 00:17:11
Все ответы на вопрос 1
8

Разбирая код, его довольно легко найти.

Во-первых, посмотрите на шаблон, используемый для архивов товаров — /templates/archive-product.php. Среди прочего, он настраивает стандартные запросы и начинает формировать разметку страницы.

Но когда начинается перебор каждого товара, работа делегируется шаблону /templates/loop-shop.php. Этот шаблон загружается для каждого товара и создает листинг, используя следующий код:

<?php do_action('woocommerce_before_shop_loop_item'); ?>
        
<a href="<?php the_permalink(); ?>">
            
    <?php do_action('woocommerce_before_shop_loop_item_title', $post, $_product); ?>
            
    <h3><?php the_title(); ?></h3>
            
    <?php do_action('woocommerce_after_shop_loop_item_title', $post, $_product); ?>
        
</a>

<?php do_action('woocommerce_after_shop_loop_item', $post, $_product); ?>

Нас интересует последнее действие: woocommerce_after_shop_loop_item. Оно подключено в файле /woocommerce_template_actions.php к функции woocommerce_template_loop_add_to_cart().

Копнув еще глубже, оказывается, что именно эта функция вам и нужна.

Как ее добавить

Самый простой способ использовать эту функцию — вызвать ее напрямую. Просто учтите, что ей требуются два параметра: $post и $_product. Следующий код вызовет ее правильно:

global $post; // Предполагаем, что он уже установлен
$_product = &new woocommerce_product( $post->ID );

woocommerce_template_loop_add_to_cart( $post, $_product );

Сама функция вызывает свои собственные echo, поэтому просто вызовите ее напрямую.

20 июн. 2012 г. 01:57:39
Комментарии

О, отлично! Я попробую.

Anriëtte Myburgh Anriëtte Myburgh
20 июн. 2012 г. 21:54:30

Это выводит именно то, что мне нужно, но похоже, что кнопка должна быть связана с каким-то JS, потому что сейчас при клике она загружает товар, не добавляя его в корзину, хотя ссылка выглядит так: {url}/?add-to-cart=9686

Anriëtte Myburgh Anriëtte Myburgh
20 июн. 2012 г. 22:06:41

Это означает, что скрипты WooCommerce не подключаются. Посмотрите /woocommerce.phpи вы увидите, какwoocommerce_frontend_scripts()привязан к хукуtemplate_redirect`. Вам нужно либо подключить это в своем коде, либо вручную загрузить необходимые фронтенд-скрипты.

EAMann EAMann
20 июн. 2012 г. 22:11:47

Я вижу, что загружается стандартный woocommerce.min.js и связанные файлы, но кнопка не перехватывается обработчиком live('click'). Есть какие-то советы?

Anriëtte Myburgh Anriëtte Myburgh
20 июн. 2012 г. 23:48:38

Без возможности посмотреть ваш сайт, я могу дать лишь ограниченные рекомендации. Обработчик клика обернут в дополнительную проверку: if (woocommerce_params.option_ajax_add_to_cart=='yes') { проходит ли код через это условие?

EAMann EAMann
20 июн. 2012 г. 23:56:25

Привет, проверил это, и я продвинулся дальше. Теперь кажется, что $.post() вообще не получает ответа. Похоже, admin-ajax.php ничего не возвращает.

Anriëtte Myburgh Anriëtte Myburgh
22 июн. 2012 г. 14:36:13

Это означает, что AJAX-хуки не добавляются. add_action('wp_ajax_woocommerce_add_to_cart', 'woocommerce_ajax_add_to_cart'); и add_action('wp_ajax_nopriv_woocommerce_add_to_cart', 'woocommerce_ajax_add_to_cart');. К сожалению, без непосредственного доступа к вашему сайту мы мало чем можем помочь. Вам нужно нанять разработчика для проверки или, возможно, напрямую связаться с командой WooCommerce.

EAMann EAMann
22 июн. 2012 г. 16:38:16

Это действительно глупо, но оказалось, что используемая мной тема имела обработчик jQuery click(), который прерывал AJAX-запрос. Я изменил его так, чтобы он не перенаправлял при клике на .add_to_cart_button, а работал только для всех остальных элементов.

Anriëtte Myburgh Anriëtte Myburgh
28 июн. 2012 г. 23:24:53
Показать остальные 3 комментариев