Поддержка WooCommerce wc_add_to_cart_message_html — убрать галочку

  • Добрый день! Я использую хук wc_add_to_cart_message_html, но независимо от того, что я верну, около сообщения выводится зелёная галочка (при добавлении в корзину без AJAX). Хотелось бы иметь возможность при ошибке убирать эту галочку или заменять её на что-либо. Пока что моё решение:

    add_filter( 'wc_add_to_cart_message_html', 'custom_add_to_cart_message', 10, 2 );
    
    function custom_add_to_cart_message($message, $products)
    {
    	if(!is_user_logged_in())
    	{
    		foreach ($products as $product_id => $value)
    		{
    			$product_item = wc_get_product($product_id);
    			$attributes = $product_item->get_attributes();
    			foreach ($attributes as $key_attr => $value_attr)
    				if($key_attr == "coins_price")
    				{
    					$img_name = "red_dot";
    					$message = "<img src='".get_site_url()."/gm-data/service_images/".$img_name.".png' width='25'> Вы не можете данный товар добавить в корзину, так как вы не авторизованы. Пожалуйста, авторизуйтесь!";
    				}
    		};
    	}
    	return $message;
    }

    При этом решении выводится ошибка про добавление товара (а другим хуком я удаляю товар из корзины в этот момент), человек видит, что ошибка добавления товара, но зелёная галочка при этом всё равно есть. Как её убрать? Может, есть другие хуки? А вообще, было бы здорово в этом случае сообщение из типа success превратить в тип error. Можно ли это сделать?

    Если я попробую сделать «return null» вместо «return $message», то сообщение исчезает, но при этом если я ещё добавлю «wc_print_notice( ‘Данный товар нельзя добавить в корзину, потому что…’, ‘error’ );», то notice выводится, но сайт зависает и полностью не прогружается.

    • Тема изменена 3 недели, 3 дня назад пользователем harchvertelol.
    • Тема изменена 3 недели, 3 дня назад пользователем harchvertelol.
Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Моё костыльное решение на текущий момент, всё работает, но, быть может, можно сделать это как-то иначе? Я просто удаляю исходное сообщение и через глобальные переменные «говорю», что нужно выдать сообщение, а выдав его, обратно через глобальную переменную говорю «не выдавать». Мне решение не нравится. Есть ли более адекватные решения? И вообще, есть ли решение, где мне не нужно во всех местах, где может всплыть уведомление о добавлении в корзину (пока я нашёл два места — на странице товара и на странице списка товаров), писать свои хуки на вывод ошибки, не выводя при этом общее сообщение? Хотелось бы поменять общее сообщение на ошибку, и не более.

    function custom_add_to_cart_message($message, $products)
    {
    	if(!is_user_logged_in())
    	{
    		foreach ($products as $product_id => $value)
    		{
    			$product_item = wc_get_product($product_id);
    			$attributes = $product_item->get_attributes();
    			foreach ($attributes as $key_attr => $value_attr)
    				if($key_attr == "coins_price")
    				{
    					//$img_name = "red_dot";
    					//$message = "<img src='".get_site_url()."/gm-data/service_images/".$img_name.".png' width='25'> Вы не можете данный товар добавить в корзину, так как вы не авторизованы. Пожалуйста, авторизуйтесь!";
    					global $error_add_to_cart_not_auth;
    					$error_add_to_cart_not_auth = true;
    					return null;
    				}
    		};
    	}
    	return $message;
    }
    
    add_action( 'woocommerce_before_single_product_summary', 'GM_woocommerce_before_single_product_summary' );
    
    function GM_woocommerce_before_single_product_summary()
    {
    	global $error_add_to_cart_not_auth;
    	if($error_add_to_cart_not_auth) wc_print_notice( 'Вы не можете данный товар добавить в корзину, так как вы не авторизованы. Пожалуйста, авторизуйтесь!', 'error' );
    	$error_add_to_cart_not_auth = false;
    }
    • Ответ изменён 3 недели, 3 дня назад пользователем harchvertelol.
    • Ответ изменён 3 недели, 3 дня назад пользователем harchvertelol.
    • Ответ изменён 3 недели, 3 дня назад пользователем harchvertelol.

    Решение найдено, использовать wc_add_notice вместо wc_print_notice:

    add_filter( 'wc_add_to_cart_message_html', 'custom_add_to_cart_message', 10, 2 );
    
    function custom_add_to_cart_message($message, $products)
    {
    	if(!is_user_logged_in())
    	{
    		foreach ($products as $product_id => $value)
    		{
    			$product_item = wc_get_product($product_id);
    			$attributes = $product_item->get_attributes();
    			foreach ($attributes as $key_attr => $value_attr)
    				if($key_attr == "coins_price")
    				{
    					wc_add_notice("Вы не можете данный товар добавить в корзину, так как вы не авторизованы. Пожалуйста, авторизуйтесь!", 'error');
    					return null;
    				}
    		};
    	}
    	return $message;
    }
Просмотр 2 ответов — с 1 по 2 (всего 2)