
Иногда у владельцев интернет-магазинов возникает желание сократить путь оформления заказа и сделать так, чтобы при переходе в магазин на WooCommerce по, например, рекламной ссылке, покупателю не нужно было бы вручную добавлять товар в корзину.
Допустим, кликает потенциальный покупатель по ссылке и сразу попадает в корзину с добавленным в нее товаром. Остается лишь перейти к оформлению заказа и его оплате, если таковая подключена на сайте.
Подобный сценарий бывает особенно удобен при продаже как простых, так и вариативных товаров или услуг, когда предлагается конкретный вариант с определенной ценой, а добавление в корзину других позиций из каталога если и не запрещено, то не предполагается.
Реализовать подобный сценарий может помочь код, приведенный ниже. Мне показалось удобным сделать так, чтобы ссылка для перехода состояла бы из двух частей или параметров: первый – это любое определенное слово или фраза, например add2cart («добавить в корзину»), а второй – артикул продукта, который всегда уникален в магазине (он же SKU).
https://vash-sait/add2cart/[артикул]
Если товар вариативный, то для каждой вариации назначается свой артикул, который и используется в ссылке (очевидно, что использование в нем только латинских символов и/или цифр без пробелов – наилучший вариант).
В результате получился следующий код:
/*
* Автоматическое добавление продукта в корзину
* при переходе по ссылке вида /add2cart/[product_sku]
*/
add_filter('template_redirect', 'my_add2cart_goto_cart');
function my_add2cart_goto_cart($template)
{
/**
* Активен ли плагин WooCommerce?
**/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
global $wp;
// Получаем адрес перехода на сайт
$request = $wp->request;
if (strlen($request) > 0 && substr_count($request, '/') > 0) {
$url_parts = explode('/', $request);
// Есть ли в адресе на первом месте «add2cart»?
if ($url_parts[0] == 'add2cart' and sizeof($url_parts) == 2) {
// Очищаем корзину
WC()->cart->empty_cart();
$product_sku = sanitize_key($url_parts[1]);
$product_id = wc_get_product_id_by_sku($product_sku);
// Не найден продукт с таким SKU;
if ($product_id == 0)
return;
// Добавляем продукт/товар в корзину
WC()->cart->add_to_cart($product_id);
// Собираем utm-метки, если есть
do_action('woocommerce_collect_utm_codes');
// Открываем корзину с добавленным в нее товаром
wp_redirect('/cart');
exit;
}
}
}
}
В приведенной функции используется вызов хука do_action('woocommerce_collect_utm_codes')
. Описание его реализации можно найти в предыдущей заметке, посвященной сбору UTM-меток в магазине на WooCommerce.