• Как сделать кнопку удаления выбранных товаров из корзины Woocommerce?

    Hу первое, для того, что бы вызвать событие . надо использовать функцию trigger
    Второе т.к. удаление происходит по ajax и Вы будете вызывать в цикле для каждого выбранного товара, то у Вас будет серия ajax запросов.

    Правильнее будет сделать так
    Собрать все id выбранных товаров и отправить один запрос на сервер и обновить страницу
    Как пример удаление всех товаров из корзины

    /**
    	 * AJAX полная очитска корзины
    	 * Функция WC_AJAX::get_refreshed_fragments() сама возвращает код возврата
    	 * todo: Сделать возврат данных для кнопки в корзине.
    	 * todo: Сейчас кнопка в корзине принудительно перезагружает страницу
    	 */
    	function ajax_clear_cart() {
    
    		WC()->cart->empty_cart( $clear_persistent_cart = true );
    		WC_AJAX::get_refreshed_fragments();
    	}
    
    	add_action( 'wp_ajax_qop_clear_cart', 'ajax_clear_cart' );
    	add_action( 'wp_ajax_nopriv_qop_clear_cart', 'ajax_clear_cart' );

    /**
         * Запуск очистки корзины
         * todo: Для страницы корзины сделать обновление без перезагрузки
         */
        $(document.body).on('click', '.qop-clear-cart', function (e) {
            var $thisbutton = $(e.target),
                location = '',
                confirmed = confirm("Внимание!!! Все товары из корзины будут удалены. Продолжить?");
    
            if (!confirmed) {
                return;
            }
    
            // т.к. кнопка очитски есть и в миникорзине, то нужно знать кто вызвал событие.
            if ($thisbutton.closest('div.widget_shopping_cart_content').length) {
                location = 'widget_mini_cart';
            } else if ($thisbutton.closest('form.woocommerce-cart-form').length) {
                location = 'page_cart';
            }
    
            let productsData = {
                action: 'qop_clear_cart',
                location: location
            };
    
            $.ajax({
                url: qopParams.ajax_url,
                type: 'POST',
                data: productsData,
                success: function (response) {
                    console.log(response);
                    if (!response || !response.fragments) {
                        return;
                    }
    
                    if ('widget_mini_cart' === location) {
                        // Trigger event so themes can refresh other areas.
                        $(document.body).trigger('removed_from_cart', [response.fragments, response.cart_hash, $thisbutton]);
                    } else if ('page_cart' === location) {
                        window.location.reload();
                    }
                },
                beforeSend: function () {
                    $($thisbutton).addClass('loading');
                },
                complete: function () {
                    $($thisbutton).removeClass('loading');
                }
            });
        });
    Ответ написан
    Комментировать
  • Почему не работает код вывода html в карточку товара woocommerce?

    Уберите знак амперсанда перед this array( &$this, 'add_custom_html' )
    Проверьте подключен ли Ваш класс и вызывается ли конструктор
    Добавьте область видимости public к Вашей функции обработчику хука.
    Ответ написан
    Комментировать
  • Есть ли плагины фильтра товаров как на Wildberries?

    Вы смешали 2 инструмента. Вывод категорий и фильтр
    Вывод категорий в нужном Вам формате выдает стандартный виджет категорий woo
    Ну а вильтр тет независимый инструмент.
    Ответ написан
    Комментировать
  • Как передавать не только названия товара но и категории в заказе Woocomerce?

    Вариантов как всегда несколько
    - можно вытащить шаблон письма в свою тему и подправить вывод.
    - можно добавлять метаданные к элементу заказа через хуки

    Как пример
    5fbb73b8b4b1e715328402.jpeg

    а вот и кодик про метаданные
    /**
     * Добавляем уведомление о том, что товар участвует в акции.
     * Проверяем участие товара в акции на момент добавления товара в заказ.
     *
     * @param WC_Order_Item_Product $item          Элемент заказа.
     * @param array                 $cart_item_key Уникальный ключ.
     * @param array                 $values
     * @param array                 $order         Экземпляр класса заказа.
     */
    function pcwoo_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
    	// проверить участвует ли этот товар в акции и если да, то добавить метаполе с сообщением.
    	$product   = $values['data'];
    	$parent_id = $product->get_id();
    	if ( 'variation' === $product->get_type() ) {
    		$parent_id = $product->get_parent_id();
    	}
    
    	// для предложения "Осеннее предложение -10% в корзине".
    	$tax     = 'promotion';
    	$term_id = 1390;
    	if ( has_term( $term_id, $tax, $parent_id ) ) {
    		$item->add_meta_data( 'promotion_' . $term_id, 'Скидка в корзине: -10%', true );
    	}
    }
    add_action( 'woocommerce_checkout_create_order_line_item', 'pcwoo_checkout_create_order_line_item', 10, 4 );
    
    // -------------------------------------------------------------------------- /
    
    /**
     * Форматируем вывод надписи в письме и в админке в карточке заказа.
     */
    function pcwoo_order_item_display_meta_key( $display_key, $meta, $order_item ) {
    	if ( 'promotion_' === substr( $display_key, 0, 10 ) ) {
    		$display_key = __( 'Участие в акции' );
    	}
    	return $display_key;
    }
    
    add_filter( 'woocommerce_order_item_display_meta_key', 'pcwoo_order_item_display_meta_key', 10, 3 );
    Ответ написан
    Комментировать
  • Как на странице заказа WooCommerce применить скидку к определённым категориям товаров в зависимости от формата доставки?

    в цикле который применяет скидку сделайте проверку на принадлежность категории через has_term и исключите этот товар из применения скидки.
    Ответ написан
    2 комментария
  • Как импортировать вариативные товары?

    Тоже была подобная проблема.
    Решение не нашел, но выход есть.
    Сначала создайте в админке вручную все атрибуты которые есть в файле импорта.
    Далее импорт проходит нормально.
    Ответ написан
  • Как вывести сумму стоимости всех товаров?

    Пробежаться по всем товарам и посчитать.
    Только процедура эта тяжелая и желательно результат кидать в транисиенты.
    править по факту изменения, удаления товара
    Ответ написан
    6 комментариев
  • Woocommerce одна функция вместо несколько?

    Все достаточно просто.
    Вам надо изменить данные которые отправляете и отправлять все выбранные пользователем позиции и их количество. А на сервере обработать входящие данные и добавить все в корзину.

    Пример обработки запроса на множественное добавление в корзину
    /**
    	 * Множественное добавление в корзину
    	 * Вызывается по Ajax
    	 *
    	 * @hook-handle qop_add_to_cart
    	 */
    	public function ajax_add_to_cart() {
    
    		$product_items = isset( $_POST['products'] ) && is_array( $_POST['products'] ) ? $_POST['products'] : false;
    
    		$errors               = array();
    		$added_products_count = 0;
    
    		foreach ( $product_items as $item ) {
    			$product_id   = $item['product_id'];
    			$quantity     = $item['quantity'];
    			$variation_id = $item['variation_id'];
    			$title        = $item['product_title'];
    			$sku          = $item['sku']; // для простого товара здесь тоже его sku
    
    
    			$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
    			$product_status    = get_post_status( $product_id );
    
    			if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id ) && 'publish' === $product_status ) {
    
    				do_action( 'woocommerce_ajax_added_to_cart', $product_id );
    				$added_products_count ++;
    
    			} else {
    				$notices = WC()->session->get( 'wc_notices', array() );
    				if ( isset( $notices['error'] ) ) {
    					$error   = array_pop( $notices['error'] );
    					$err_msg = preg_replace( '/<a.*?href.*?=(.*)>(.*?)<\/a>/', '', $error );
    
    					$errors[] = array(
    						'variationId' => $variation_id,
    						'title'       => $title,
    						'sku'         => $sku,
    						'msg'         => $err_msg,
    					);
    				}
    				wc_clear_notices();
    			}
    		}
    
    		$response = array(
    			'added'  => $added_products_count,
    			'errors' => $errors,
    			'popup'  => $this->template_errors_formating( $errors ),  // Формирование собственного popup-a для пользователя
    			'cart'   => $this->get_refreshed_fragments(),  // необходимо для обновления миникорзины в шапке.
    		);
    
    		wp_send_json( $response );
    	}
    Ответ написан
    1 комментарий
  • Как сделать шаг количества у вариаций товара woocommerce?

    Самый простой путь это указать в описании содержимое пачки и тогда отсчитывать по одной пачке. Вы можете добавить описание индивидуально к вариации.

    В противном случае Вам надо добавлять метаполе к каждой вариации где Вы будете указывать это значение (шаг) и позже по хуку-фильтру woocommerce_quantity_input_step выводить это значение. Тогда для каждой вариации у Вас будут разные значения шага.
    Ответ написан
    Комментировать
  • Как собрать все значения, удовлетворяющие указанным условиям?

    У Вас i должно меняться от 2 до 92, а ii от 2 до 25, т.к. первый аргумент в Cells это строка, а сторой это столбец.
    Остальное норм должно работать.

    Можете добавить Debug.print Cells(i,ii) для вывода значений в консоль и посмотреть чем оперирует инструкция сравнения
    Что бы увидеть консоль Ctrl+G или меню View->Immediate Window
    Ответ написан
    1 комментарий
  • Почему не меняются цены вариативного товара?

    Информиция о выбранном атрибуте сохраняется в таблице wp_postmeta в поле с ключом attribute_pa_xxx, где ххх - это слаг Вашего атрибута, индивидуально для каждой разновидности(вариации). Проверьте содержимое этих записей на соответсвие.

    Также попробуйте отключить все сторонние плагины, что бы исключить их влияние.

    Как рекомендация - использовать плагины транслитерации (CyrToLat - например) слагов. Это исключит проблемы с функциями сравнения.
    Ответ написан
    2 комментария
  • Магазин на WordPress + woocommerce, при попытке загрузки товаров CSV нет картинки товара, в чем может быть проблема?

    Проверьте csv. Формат информации о картинке должен представлять собой url ссылку на картинку. т.е. Вы должны иметь возможность свободно ее скачать.
    Ответ написан
    1 комментарий
  • Какой выбрать плагин ftp для vscode?

    я пользуюсь Remote FS Настройка простая. Пару нажатий клавиш и нужный каталог уже у тебя в панели. Правишь и с охраняется сразу на сервер. Единственное что мне в нем не хватает, так это поиска по файлам.
    Ответ написан
  • Как поменять порядок вывода товаров по умолчанию?

    В интернете нашел такой кусочек кода, но как его нужно обернуть чтобы он менял порядок моих товаров?
    Ответ НИКАК. Потому, что это модуль управления сортировкой по метаполям, у а Вас требуется по значению атрибута.

    Как вариант, Вам нужно написать блок кода который будет транслировать Ваши атрибуты в метаполя и уже после делать сортировку используя Ваш кусочек кода. Задача не тривиальная, но решаемая.
    Вот примерный алгоритм
    • Для каждого значения атрибута(термина в таблице wp_terms) добавить метаполе (в таблицу метаполей терминов) со значением порядка сортировки (0,1,2,3,...)
    • Подключится к хуку сохранения товара и считать значение метаполя атрибута для сохраняемого товара
    • Сохраниить это значение в метаполе товара
    • Сделать сортировку по метаполю


    Ну как то так.
    Ответ написан
    7 комментариев
  • Woocommerce потерял связь между атрибутами в вариациях?

    Просто так ничего не происодит.
    Вы что то сделали и это результат вмешательства.

    Что делать
    - Перезалить
    - Или откатиться на бэкап.
    - Или вручную править
    Ответ написан
  • Woocommerce реализовать Wishlist можно только через плагин или кодом и руками тоже?

    Ответ. Конечно можно!
    Плагин - это кем то написанный код.
    Скачиваете любой плагин и смотрите его код.
    Ответ написан
    Комментировать
  • Как добавить подарок в корзину и заказ?

    Так в одной функции этого не сделаешь
    - В момент добавления товара Вам нужно добавить еще один товар.
    - Для учета стоимости подарка можно добавить скидку к заказу.
    - Продумать вариант удаления подарка, если пользователь удалит основной товар.

    Как пример ниже. Взято с реального проекта. Т.к. акция была разовая, я не заморачивался с настройками и зашил идентификаторы жестко в коде.

    Добавляется подарочный товар "Мяч" если пользователь кладет в корзину любой товар из таксономии "promotion" с id=1280
    /**
     * Add product id=42444 "ball STORM PRO HB" to cart if added any product from
     * promotion 1280
     *
     * @param $cart_item_key Current cart item key.
     * @param $product_id    Current product id (parent id for variations).
     *
     * @throws Exception
     */
    function hml_woocommerce_add_to_cart( $cart_item_key, $product_id ) {
    	$tax     = 'promotion';
    	$term_id = 1280;
    	if ( ! has_term( $term_id, $tax, $product_id ) ) {
    		return;
    	}
    
    	foreach ( WC()->cart->get_cart() as $cart_item ) {
    		$product_in_cart = $cart_item['product_id'];
    		if ( $product_in_cart === 42444 ) {
    			return;
    		}
    	}
    
    	WC()->cart->add_to_cart( 42444, 1, 42450 ); // аргументы: id-товара, кол-во, id-разновидности(вариации)
    }
    
    add_action( 'woocommerce_add_to_cart', 'hml_woocommerce_add_to_cart', 10, 2 );


    Код ниже заменяет поле выбора количества для подарочного товара, но для того что бы woo мог его обрабатывать делает input скрытым.
    /**
     * Filter quantity input tag for cart item.
     * Actualy replace input tag with const "1" for certain products
     *
     * @param $product_quantity Default output.
     * @param $cart_item_key    Current cart item key.
     * @param $cart_item        Current cart item.
     *
     * @return string
     */
    function hml_woo_cart_item_quantity( $product_quantity, $cart_item_key, $cart_item ) {
    	$product_in_cart = $cart_item['product_id'];
    	if ( $product_in_cart === 42444 ) {
    		$product_quantity = sprintf( '1 <input type="hidden" name="cart[%s][qty]" value="1" />', $cart_item_key );
    	}
    	return $product_quantity;
    }
    
    add_filter( 'woocommerce_cart_item_quantity', 'hml_woo_cart_item_quantity', 10, 3 );


    для добавления скидки (компенсации цены подарочного товара) к заказу можете использовать хук 'woocommerce_cart_calculate_fees'

    С Удалением я не заморачивался, поэтому подсказать хук не смогу. надо гуглить.
    Ответ написан
    Комментировать
  • Почему не работает выборка в форму wordpress?

    Вообще классная штука отладчик. Очень рекомендую пользоваться.

    Беглый взгляд показывает, что Вы сохраняете данные в метаполе с именем _gift_product_id а читаете из _gift_product_ids обратите внимание на последнюю букву в назывании.

    Отладчик бы вам это показал.
    Ответ написан
    Комментировать
  • Как добавить виджет как на скрине?

    Собственно ничего сложного.
    Добавьте новый текстовый виджет (или html). Вместо чисел пропишите вызов своих шорткодов.
    Создайте свои шорткоды, это очено просто, и выводите нужную информацию.
    У Вас могут быть отключена поддержка шорткодов, как включить есть здесь
    Три последние числа можно взять с wp, а вот просмотры и посетители,скорее всего удобнее будет подключить какой то ресурс и считывать с него. Обязательно все внешние запросы кэшируйте у себя в трансиентах.
    Ответ написан
    Комментировать