Ответы пользователя по тегу WooСommerce
  • Как добавить в стандартную форму регистрации woocommerce ещё одну роль пользователя?

    Как то странно, это что регистрируемый сам себе роль назначать будет?
    Обычно регистрируются под минимальной ( с мин. разрешениями) ролью, а потом менеджер или админ меняет роль.
    Ответ написан
    6 комментариев
  • Как и можно ли через functions.php изменить(кусочек) кода в плагине?

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

    И еще вариант:
    Зайти в файл переводов и для фраз '%d item', '%d items' для русского перевода подкорректировать текст. Правда (ВНИМАНИЕ), если такая конструкция еще где-то используется, то повлияет и на нее.
    Ответ написан
  • Как из БД wordpress экспортировать только товары Woocommerce (phpmyadmin)?

    Интересный вопрос!
    А что Вы потом со всем этим добром (неструктурированным ) делать будете?

    В woo есть стандартный инструмент выгрузки и загрузки. Используйте его.
    Ответ написан
  • Плагин обновления цен в WooCommerce по курсу ЦБ?

    чего в моём случае просто не нужно.

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

    Для размышлений:
    Если будете менять цену, как Вы и предполагаете сейчас, то Вам нужно будет 1раз в день пробегаться по всей базе товаров и программно пересчитывать все цены и скидки. Причем это желательно делать через основные средства woocommerce, дабы все сторонние плагины пыли проинформированы и выполнили соотв действия. Если товаров много, то это уже крон задачи, а значит может произойти такой момент, когда несколько товаров уже обновилось, а несколько еще нет и клиент может это видеть. Плюс нагрузка на сервер ежедневная (небольшая, но все-же).

    Если использовать мультивалютный плагин, то пересчет идет в момент запроса. Данные всегда актуальны. Крон задач нет. Доп. нагрузки нет.

    Единственный момент - это кэширование. Но, если оно у Вас имеется, то в любом случае нужно будет ежедневно сбрасывать весь кэш товаров и категорий.
    Ответ написан
    3 комментария
  • Woocommerce. Как кастомизовать атрибуты (размер товара)?

    Конкретизируйте вопрос пожалуйста.
    Что конкретно вы хотите кастомизировать (настроить)?

    Если возможность покупки сразу нескольких вариаций, то возможно потребуется что то дописать.
    Пример
    Ответ написан
  • Как при статусе «В ожидании оплаты» отправить письмо клиенту?

    Вам нужно написать свой класс отправки сообщений унаследованный от WC_Email. В Вашем новом классе вы можете установить триггер на нужный хук. Таким образом Ваш новый класс по хуку отправит email сообщение.

    Вот пример класса в котором подключен пользовательский хук
    <?php
    
    if (!defined('ABSPATH')) {
        exit;
    } // Exit if accessed directly
    
    /**
     * A custom Expedited Order WooCommerce Email class
     *
     * @since 0.1
     * @extends \WC_Email
     */
    class WC_AMO_New_Order_Email extends WC_Email
    {
    
        /**
         *  Ключ идентификатор типа заказа
         */
        public $type_auth_key;
    
        /**
         * Set email defaults
         *
         * @since 0.1
         */
        public function __construct($plugin_dir)
        {
    
            // set ID, this simply needs to be a unique name.
            $this->id = 'wc_amo_new_order';
    
            // this is the title in WooCommerce Email settings.
            $this->title = 'Новые заказы для АМО';
    
            // Заполняем ключ идентификатор типа заказа (значение по умолчанию).
            $this->type_auth_key = 'hummelua_cartorder';
    
            // this is the description in WooCommerce email settings.
            $this->description = 'Письмо - уведомление о новом заказе будет отправлено в специальном формате для интеграции с AmoCRM';
    
            // these are the default heading and subject lines that can be overridden using the settings.
            $this->heading = __('New customer order', 'woocommerce');
            $this->subject = __('[{site_title}] New customer order ({order_number}) - {order_date}', 'woocommerce');
    
            // these define the locations of the templates that this email should use, we'll just use the new order template since this email is similar.
            $this->template_base = $plugin_dir . '/templates/';
            $this->template_html = 'admin-new-order-html.php';
            $this->template_plain = 'admin-new-order-plain.php';
    
            // Trigger on new paid orders.
            add_action('woocommerce_checkout_order_processed_notification', array($this, 'trigger'));
            add_action('hml_quick_order_processed_notification', array($this, 'trigger'));
    
            // Call parent constructor to load any other defaults not explicity defined here.
            parent::__construct();
    
            // this sets the recipient to the settings defined below in init_form_fields().
            $this->recipient = $this->get_option('recipient');
    
            // if none was entered, just use the WP admin email as a fallback.
            if (!$this->recipient) {
                $this->recipient = get_option('admin_email');
            }
        }
    
    
        /**
         * Determine if the email should actually be sent and setup email merge variables
         *
         * @since 0.1
         *
         * @param int $order_id ID заказа
         */
        public function trigger($order_id)
        {
    
            // bail if no order ID is present.
            if (!$order_id) {
                return;
            }
    
            // setup order object.
            $this->object = new WC_Order($order_id);
    
            /**
             * Здесь мы можем проверить некоторые условия которые отпределяют
             * необходимость отправки этого письма
             * if ( условие ) { return; }
             */
    
            $tak = get_post_meta($order_id, 'type_auth_key', true);
            if ('hummelua_quickorder' === $tak) {
                $this->type_auth_key = $tak;
            }
    
            // replace variables in the subject/headings.
            $this->find[] = '{order_date}';
            $this->replace[] = date_i18n(wc_date_format(), $this->object->get_date_created()->getOffsetTimestamp());
    
            $this->find[] = '{order_number}';
            $this->replace[] = $this->object->get_order_number();
    
            if (!$this->is_enabled() || !$this->get_recipient()) {
                return;
            }
    
            // woohoo, send the email!
            $success = $this->send($this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments());
    
            if ($success) {
    			// добавить примечание к заказу что отправлено письмо для амо.
    			$this->object->add_order_note(
    				sprintf(
    					'Уведомление для AmoCRM отправлено на %s.',
    					$this->recipient
    				)
    			);
    		} else {
            	$msg = 'Произошла ошибка отправки письма в AmoCRM по заказу #' . $order_id . '. Истрочник WC_AMO_New_Order_Email.';
    			$this->send('tpychev@gmail.com', '[Hml] - Error to send mail!', $msg, $this->get_headers(), '');
    		}
        }
    
        /**
         * Get email subject.
         *
         * @return string
         */
        public function get_subject()
        {
            switch ($this->type_auth_key) {
                case 'hummelua_quickorder':
                    $this->subject = '[Hml-{order_number}] Быстрый заказ — {order_date}';
                    break;
                case 'hummelua_cartorder':
                    $this->subject = '[Hml-{order_number}] Заказ из корзины — {order_date}';
                    break;
                default:
                    $this->subject = '[Hml-{order_number}] Новый заказ — {order_date}';
            }
            return apply_filters('woocommerce_email_subject_' . $this->id, $this->format_string($this->subject), $this->object);
        }
    
        /**
         * get_content_html function.
         *
         * @since 0.1
         * @return string
         */
        public function get_content_html()
        {
            return wc_get_template_html(
                $this->template_html,
                array(
                    'order' => $this->object,
                    'email_heading' => $this->get_heading(),
                    'sent_to_admin' => true,
                    'plain_text' => false,
                    'email' => $this
                ),
                $this->template_base,
                $this->template_base
            );
        }
    
    
        /**
         * get_content_plain function.
         *
         * @since 0.1
         * @return string
         */
        public function get_content_plain()
        {
            return wc_get_template_html(
                $this->template_plain,
                array(
                    'order' => $this->object,
                    'email_heading' => $this->get_heading(),
                    'sent_to_admin' => true,
                    'plain_text' => true,
                    'email' => $this
                ),
                $this->template_base,
                $this->template_base
            );
        }
    
    
        /**
         * Initialize Settings Form Fields
         *
         * @since 2.0
         */
        public function init_form_fields()
        {
    
            $this->form_fields = array(
                'enabled' => array(
                    'title' => 'Enable/Disable',
                    'type' => 'checkbox',
                    'label' => 'Enable this email notification',
                    'default' => 'yes'
                ),
                'recipient' => array(
                    'title' => 'Recipient(s)',
                    'type' => 'text',
                    'description' => sprintf('Enter recipients (comma separated) for this email. Defaults to <code>%s</code>.', esc_attr(get_option('admin_email'))),
                    'placeholder' => '',
                    'default' => ''
                ),
                'subject' => array(
                    'title' => 'Subject',
                    'type' => 'text',
                    'description' => sprintf('This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', $this->subject),
                    'placeholder' => '',
                    'default' => ''
                ),
                'heading' => array(
                    'title' => 'Email Heading',
                    'type' => 'text',
                    'description' => sprintf(__('This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.'), $this->heading),
                    'placeholder' => '',
                    'default' => ''
                ),
                'email_type' => array(
                    'title' => 'Email type',
                    'type' => 'select',
                    'description' => 'Choose which format of email to send.',
                    'default' => 'html',
                    'class' => 'email_type',
                    'options' => array(
                        'plain' => __('Plain text', 'woocommerce'),
                        'html' => __('HTML', 'woocommerce'),
                    )
                )
            );
        }
    }


    Класс появится в настройках woo на вкладке emails

    Вот список хуков по статусам заказа

    А вот как добавить поле в админку заказа для заполнения, не знаю, надо гуглить.
    Ответ написан
    Комментировать
  • Как реализовать пошаговый фильтр товаров в Woocommerce. Например - бренд > серия > модель?

    посмотрите woof filter. Там , по моему есть пошаговый фильтр.

    Вариант 2: Писать свой
    Ответ написан
    Комментировать
  • Как сделать добавление товара в корзину woocommerce, без перезагрузки страницы?

    Поставьте чистый woo + тема storefront. Посмотрите как это сделано там.
    Весь нужный функционал уже есть в woo
    js обработчики здесь wp-content\plugins\woocommerce\assets\js\frontend\add-to-cart.js

    Либо по аналогии напишите свой обработчик для своей кнопки.
    Ответ написан
    Комментировать
  • Как вывести количество товаров в корзине на иконку wp-megamenu?

    В теме storefront это делается так
    <?php /* translators: %d: number of items in cart */ ?>
        <?php echo wp_kses_post( WC()->cart->get_cart_subtotal() ); ?>
            <span class="count">
                <?php echo wp_kses_data( sprintf( _n( '%d item', '%d items', WC()->cart->get_cart_contents_count(), 'storefront' ), WC()->cart->get_cart_contents_count() ) ); ?>
            </span>
    Ответ написан
  • Необходимо убрать вывод товаров в woocommerce, которые не находятся на складе - как это реализовать?

    меню WooCommerce->Настройки->Товары->Запасы->Спрятать отсутствующие товары из каталога - поставить галку
    Ответ написан
    Комментировать
  • Как сделать сортировку товаров отдельной категории woocommerce по цене?

    как то так
    /************************************************************************/
    /* Выставляем порядок товаров для некоторых категорий */
    /* порядок только для сортировки "по умолчанию" */
    
    add_filter( 'woocommerce_get_catalog_ordering_args', 'my_woocommerce_get_catalog_ordering_args' );
    
    function my_woocommerce_get_catalog_ordering_args( $args ) {
    
    	// сортировка для этой категории "от дешевых к дорогим"
    	// /product-category/novyie-postupleniya/aksessuaryi-dlya-podarkov/
    
    	if ( is_product_category('aksessuaryi-dlya-podarkov') && false !== stripos($args['orderby'], 'menu_order') ) {
    		$args['orderby'] = 'meta_value_num ID';
    		$args['order'] = 'ASC'; //(или 'DESC';)
    		$args['meta_key'] = '_price';
    	}
    
    	return $args;
    }
    /************************************************************************/
    Ответ написан
    1 комментарий
  • Как вывести эту функцию в определенное место?

    То, что вы показали - это шаблон вывода поля ввода количества (input элемента)
    Шаблон можно вызвать обычной
    wc_get_template( 'global/quantity-input.php', $args );
    . Собственно он так и вызывается. Но ему нужны определенный список данных для работы.
    Стандартный вызов этого шаблона здесь
    В общем то все что Вам нужно сделать это вызвать функцию которая вызывает шаблон
    do_action( 'woocommerce_before_add_to_cart_quantity' );
    
    		woocommerce_quantity_input( array(
    			'min_value'   => apply_filters( 'woocommerce_quantity_input_min', $product->get_min_purchase_quantity(), $product ),
    			'max_value'   => apply_filters( 'woocommerce_quantity_input_max', $product->get_max_purchase_quantity(), $product ),
    			'input_value' => isset( $_POST['quantity'] ) ? wc_stock_amount( wp_unslash( $_POST['quantity'] ) ) : $product->get_min_purchase_quantity(), // WPCS: CSRF ok, input var ok.
    		) );
    
    		do_action( 'woocommerce_after_add_to_cart_quantity' );

    Примеры вызова этой функции а также обрамляющих ее хуков см в шаблонах типов товаров
    например woocommerce/templates/single-product/add-to-cart/simple.php
    Ответ написан
    Комментировать
  • Как сделать простой товар, но с некоторыми возможностями вариативного?

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

    Вот здесь есть хуки карточки товара. Выбираете нужный и добавляете html код Вашей кнопки.
    Можете подсмотреть как это делает сам woocommerce пробежавшись по обработчикам этих хуков в самом плагине
    Ответ написан
    Комментировать
  • Woocommerce: Как массово перевести товары в черновик?

    А зачем?
    Выбираете товары -> действие "Изменить" -> кнопка "Применить -> Устанавливаете новый статус (черновик) -> и OK.
    Ответ написан
    2 комментария
  • Как добавить стиль CSS для кнопки на плагине Wordpress?

    Посмотрите какие классы прописаны кнопке "купить" и попробуйте подставить. И ссылку своей кнопке подмените.
    Ответ написан
    Комментировать
  • Как запретить предзаказ в WooCommerce?

    самое логичное - это изменить значения в карточке товара в админке

    Ну а если через код,посмотрите в сторону хука woocommerce_add_to_cart_validation. Он вызывается аккурат перед добавлением товара в корзину. И загляните еще в функцию wc_protected_product_add_to_cart если хотите что то отображать пользователю (почему он не может добавить товар в корзину)

    Но, лучше исключать возможность добавления, чем информировать почему нельзя добавить.
    Ответ написан
  • Как убрать максимальную цену в вариативном товаре Woocommerce?

    Загляните сюда. И вообще на этом сайте сделайте поиск по ключу "price". Найдете много интересного.
    Ответ написан
  • Как добавить окно ввода текста в карточку товара?

    Это же платный плагин, задайте вопрос в поддержку. Скорее всего это связано с переписыванием участков как php так и js кода.

    Мы у себя решили отказаться от использования цвета в атрибутах в пользу отдельного товара. таким образом каждый цвет - это отдельный товар.
    Ответ написан
    Комментировать