Изменяем кнопку добавления в корзину, если товар уже в ней

По умолчанию в WooCommerce, когда вы нажимаете на кнопку добавления в корзину для товара, который уже в ней, количество единиц этого товара в корзине увеличится на единицу.

В этом уроке я покажу вам, как изменить это стандартное поведение, поменяв текст кнопки и URL.

Только изменяем текст кнопки

В этом случае нам пригодятся следующие вещи –  во-первых, фильтр-хуки woocommerce_product_single_add_to_cart_text, woocommerce_product_add_to_cart_text, первый – для страницы самого товара, второй – для каталога товаров, а во вторых, код, который проверяет, что товар в корзине и про который у меня на сайте есть отдельный урок.

Сниппет для вашего functions.php:

// для страницы самого товара
add_filter( 'woocommerce_product_single_add_to_cart_text', 'truemisha_single_product_btn_text' );
 
function truemisha_single_product_btn_text( $text ) {
 
	if( WC()->cart->find_product_in_cart( WC()->cart->generate_cart_id( get_the_ID() ) ) ) {
		$text = 'Уже в корзине, добавить снова?';
	}
 
	return $text;
 
}
 
// для страниц каталога товаров, категорий товаров и т д
add_filter( 'woocommerce_product_add_to_cart_text', 'truemisha_product_btn_text', 20, 2 );
 
function truemisha_product_btn_text( $text, $product ) {
 
	if( 
	   $product->is_type( 'simple' )
	   && $product->is_purchasable()
	   && $product->is_in_stock()
	   && WC()->cart->find_product_in_cart( WC()->cart->generate_cart_id( $product->get_id() ) )
	) {
 
		$text = 'Уже в корзине, добавить снова?';
 
	}
 
	return $text;
 
}

На строчках 20-22 я добавил несколько проверок: то, что товар простой, что его возможно купить и что он в наличии, вы можете добавить туда парочку своих условий, например $product->is_sold_individually() – в таком случае кнопка будет меняться, если в настройках товара отмечена галка «Продавать индивидуально».

Если вдруг вы захотите пойти дальше и полностью поменять HTML кнопки, то можете попробовать использовать woocommerce_loop_add_to_cart_link.

// для цикла, на страницах самих товаров подобных хуков нет
add_filter( 'woocommerce_loop_add_to_cart_link', 'truemisha_product_btn_html', 20, 3 );
 
function truemisha_product_btn_html( $html, $product, $args ) {
 
}

В этом коде в принципе вам должно быть понятно, что $html – тег <a> кнопки, $product – объект товара, $args – дополнительные параметры, распечатайте print_r(), если интересно, что внутри.

Обратите внимание, что этот код не заточен под AJAX, то есть если у вас используется мини-корзина и/или включено добавление товаров через AJAX в каталоге, то вероятно, что текст не будет изменяться как нужно. Хотели бы и это настроить? Ну что же, на моём видеокурсе по WooCommerce этому вопросу уделяется отдельное внимание.

Изменяем ещё и URL кнопки

Тут нам поможет woocommerce_product_add_to_cart_url.

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

Для получения URL страницы корзины динамически мы будем использовать функцию wc_get_cart_url().

add_filter( 'woocommerce_product_add_to_cart_url', 'truemisha_product_cart_url', 20, 2 );
 
function truemisha_product_cart_url( $url, $product ) {
 
	if( 
	   $product->is_type( 'simple' )
	   && $product->is_purchasable()
	   && $product->is_in_stock()
	   && WC()->cart->find_product_in_cart( WC()->cart->generate_cart_id( $product->get_id() ) )
	) {
 
		$url = wc_get_cart_url();
 
	}
 
	return $url;
 
}

Миша

Недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 3

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.