Ответы пользователя по тегу WooСommerce
  • Раздельная оплата товаров или очередной "купить в один клик" - как?

    Проще
    Для заказа в один клик Вам корзина вообще не нужна.
    - Отправляете AJAX-ом данные о товаре
    - Создаете заказ, наполняете , оформляете
    Как пример
    $qorder = wc_create_order();
    
    	if ( 0 === $params['type'] ) { /* simple */
    		$product    = wc_get_product( $params['id'] );
    		$item_id    = $qorder->add_product( $product, $params['qty'] );
    	} elseif ( 1 === $params['type'] ) { /* variable */
    		$variations_array = array();
    
    		$var_product                   = new WC_Product_Variation( $params['var_id'] );
    		$variations_array['variation'] = array(
    			$params['attr_name'] => $params['attr_value'],
    		);
    
    		$item_id    = $qorder->add_product( $var_product, $params['qty'], $variations_array );
    	}
    
    	$qorder->set_address( $address, 'billing' );
    	$qorder->set_address( $address, 'shipping' );
    
    	$qorder->calculate_totals();
    	wc_reduce_stock_levels( $qorder->get_id() );
    	$qorder->update_status( 'processing' );
    	echo 'Спасибо за заказ';
    Ответ написан
    6 комментариев
  • Wordpress / Woocommerce - Как отправлять заполненную форму на почту в зависимости от страны?

    Вариантов как всегда несколько, и даипазон меняется от правильных до "костыльных"

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

    Тут показаны хуки страницы архива (категорий)
    Берите нужный и выводите желаемое
    Ответ написан
  • Как сделать чтобы выбранные вариации автоматически очищались, при нажатии на кнопку "Добавить в корзину"?

    Имитируйте нажатие на кнопку "очистить" через js
    Ответ написан
    Комментировать
  • Как все товары сделать вариацией одного?

    Как вариант:
    - Сделайте копию БД
    - Создайте новый товар, к которому Вы будете прикреплять вариации. Добавьте соотв. атрибут и создайте одну вариацию.
    - Сделайте выгрузку всей котегории стандартным эскпортом woo.
    - откройте Ваш csv и скорректируйте поля для товаров которые Вы хотите сделать вариациями по примеру новой вариации.
    - Загрузите обратно используя стандартный импорт Woo. Если не выйдет, то попробуйте перед импортом удалить товары, которые хотите сделать вариациями.
    Ответ написан
    Комментировать
  • Как при импорте товаров заполнять поля ACF?

    Использовать родной инструмент импорта.
    1-Выгрузить родным экспортером любой товар с включенной функцией "метаполей"
    2- посмотреть как выгружаются метаполя
    3-отформатировать по такому же формату свои данные
    4-загрузить родным импортером
    Ответ написан
    1 комментарий
  • Как сделать вывод вариаций товара на странице листинга?

    Может тогда отказаться от вариативных товаров и не пытаться сломать систему.

    Но если очень хочется то есть соотв плагины поиск

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

    Вот содержимое функции is_type()
    /**
    	 * Checks the product type.
    	 *
    	 * Backwards compatibility with downloadable/virtual.
    	 *
    	 * @param  string|array $type Array or string of types.
    	 * @return bool
    	 */
    	public function is_type( $type ) {
    		return ( $this->get_type() === $type || ( is_array( $type ) && in_array( $this->get_type(), $type, true ) ) );
    	}

    A Вот, что возвращает get_type для Вариации
    /**
    	 * Get internal type.
    	 *
    	 * @return string
    	 */
    	public function get_type() {
    		return 'variation';
    	}


    получается что так
    if ( $product->is_type( 'variation' ))
    Ответ написан
    Комментировать
  • Как добавить цену за единицу в данные заказа woocommerce?

    Загляните в шаблоны писем /woocommerce/templates/emails
    Найдите нужный Вам шаблон. Скорее всего это email-order-items.php
    Найдите подходяший Вам хук и добавляйте в письмо любую информацию.

    Примерно на 67 строке.
    // allow other plugins to add additional product information here.
    		do_action( 'woocommerce_order_item_meta_end', $item_id, $item, $order, $plain_text );
    Ответ написан
  • Не показывает реально наличие остатков в Woocomerce?

    Подобный вопрос не раз поднимался.
    "Товар" в Woo это не просто запись в базе - это сущность, и сменой какого то поля можно нарушить его целостность. А если еще несколько плагинов по управлению товарами подключены, то и нарушить нормальную работу этих плагинов.

    Правильное изменение состояния это через код через WC_Product. Да, долго, тяжело, надо разбивать но блоки если много товаров. Зато надежно.
    $product = wc_get_product($id);
    ... делаем что то 
    $product->save();


    в Вашем случае, если говорить только про Woo (я подразумеваю, что никакие другие плагины не зависят от этого изменения), Вам нужно заглянуть еще в поле stock_status и в таблицу ..._wc_product_meta_lookup
    Ответ написан
    2 комментария
  • Как сделать кнопку удаления выбранных товаров из корзины 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 выводить это значение. Тогда для каждой вариации у Вас будут разные значения шага.
    Ответ написан
    Комментировать
  • Почему не меняются цены вариативного товара?

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

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

    Как рекомендация - использовать плагины транслитерации (CyrToLat - например) слагов. Это исключит проблемы с функциями сравнения.
    Ответ написан
    2 комментария