Поддержка WooCommerce Уведомления при AJAX-добавлении в корзину

  • Я хочу при AJAX-добавлении в корзину выводить пользователю сообщение при некоторых условиях. Если кратко, то некоторые товары я не хочу, чтобы можно было добавить в корзину без авторизации. Я научился не давать добавлять товары в корзину при этих условиях, но не получается выводить при этом сообщение при AJAX-добавлении. Вот мой код:

    add_action( 'woocommerce_add_to_cart', 'GM_add_to_cart_action', 10, 6 );
    
    function GM_add_to_cart_action( $cart_id, $product_id, $request_quantity, $variation_id, $variation, $cart_item_data )
    {
    	if(!is_user_logged_in())
    	{
    		$product_item = wc_get_product($product_id);
    		$attributes = $product_item->get_attributes();
    		foreach ($attributes as $key_attr => $value_attr)
    			if($key_attr == "coins_price")
    			{
    				foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item )
    				{
    					if ( $cart_item['product_id'] == $product_id )
    					{
    						WC()->cart->remove_cart_item( $cart_item_key );
    					}
    				}
    				//wc_print_notice( 'Данный товар нельзя добавить в корзину, потому что...', 'error' );
    			}
    	}
    }

    Если я раскомментирую wc_print_notice, то сообщения всё равно не будет, а кнопка добавления будет зависать на «крутящемся кружочке». Я думаю, что это из-за того, что нет какого-то объекта при AJAX-добавлении, отвечающего за notice. Как я могу вывести пользователю notice при AJAX-добавлении?

    P. S. я видел похожую тему, но решения там нет (без изменения кода WooCommerce): https://wordpress.org/support/topic/notices-after-ajax-add-to-cart/

Просмотр 1 ответа (всего 1)
  • Моё костыльное решение:
    1) Отключить AJAX для кнопки добавления в корзину.
    2) Использовать хуки:

    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;
    }

    Есть ли решение с сохранением AJAX?

    • Ответ изменён 3 недели, 2 дня назад пользователем harchvertelol.
    • Ответ изменён 3 недели, 2 дня назад пользователем harchvertelol.
Просмотр 1 ответа (всего 1)