Не приходят оповещения о Новых заказах от WooCommerce

При создании нового заказа (покупки) на сайте интернет-магазина под управлением WordPress+WooCommerce, должны приходить E-mail оповещения, как клиенту (тот кто заказал), так и администратору сайта.

Заказы, которые правильно переходят в обработку, тоже должны генерировать электронное письмо. Если этого не происходит и вы не получаете письма, то первым делом стоит проверить папку СПАМ вашей почты, вполне возможно эти письма там 🙂

Ещё наиболее частой причиной того, почему от WooCommerce не приходят должные оповещения при новом заказе от клиента может служить неправильная настройка E-mail оповещений. 

Как указать E-mail адресатов на события о новых заказах?

Зайдите в панель управления сайтом WordPress и перейдите по следующему пути:

WooСommerce → Настройки → Email’ы

Здесь мы увидим таблицу событий при которых отправляются письма-уведомления от Woo.

Большинство из этих уведомлений предназначено для клиента, а для нас есть три важных события:

  • Новый заказ
  • Отменённый заказ
  • Неудавшийся заказ

Email-уведомления отправленные из WooCommerce перечислены ниже. Кликните по Email’у, чтобы настроить его.

Настройка оповещений по почте

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

получатели е-мэйл

Иногда может встречаться ещё одна проблема, которая заключается в адресе почты отправителя. 

Woocommerce → Настройки → Email’ы , далее следует «прокрутить» вниз страницы и проверить какой адрес почты указан в качестве Отправителя. Он должен совпадать с доменом Вашего сайта ?

адрес отправителя

Чтобы не пропускать письма и фиксировать их внутри сайта рекомендуется воспользоваться этим решением.

Удачи!

Как в WooCommerce отобразить SKU вариаций в панели управления (админке)?

Чтобы в ячейке для SKU, в панели администрирования WordPress, отображать все артикулы вариаций у вариативных товаров достаточно добавить данный сниппет:

/**
 * @snippet       Display Variation SKUs @ WooCommerce Product Admin
 * @author        Code==Poetry
 */
  
add_filter( 'woocommerce_product_get_sku', 'poet_variable_product_skus_admin', 9999, 2 );
 
function poet_variable_product_skus_admin( $sku, $product ) {
   if ( ! is_admin() ) return $sku;
   global $post_type, $pagenow;
   if ( 'edit.php' === $pagenow && 'product' === $post_type ) {
      if ( $product->is_type('variable') ) {
         $sku = ''; // $sku = $product->get_sku();
         foreach ( $product->get_children() as $child_id ) {
            $variation = wc_get_product( $child_id ); 
            if ( $variation && $variation->exists() ) $sku .= '(' . $variation->get_sku() . ')';
         }
      }
   }
   return $sku;
}

Как сделать копирование артикула товара по клику в WooCommerce?

Задача: для удобства сотрудников сделать копирование артикула по клику.

Реализовывать мы будем это на стороне клиента (браузера) при помощи JavaScript используя нужные нам методы при работе с DOM.

Давайте рассуждать. У нас есть артикул, значение которого выводится в строчном элементе <span>, благодаря атрибуту class мы можем «зацепиться за него» — это, условно говоря, его имя.

sku

Так как нам нужно только его значение, отметим для себя элемент span с классом «sku»

Нам нужно его выдернуть из DOM (Объектная Модель Документа) и в этом нам поможет метод querySelector()

Согласитесь, что нашего элемента может на странице и не существовать, поэтому нужно проверить его существование. Если совпадений не будет найдено, то наш метод вернёт значение null.

Давайте реализуем эту логику в виде кода.

const sku = document.querySelector(".sku");

if(sku !== null){
    console.log(sku);
}

Если вы всё сделали правильно, то непременно увидите в консоли этот выбранный элемент:

Image 00000089 - Как сделать копирование артикула товара по клику в WooCommerce?

Следующим логическим шагом нам нужно будет отследить событие клика по этому элементу. В этом нам поможет метод

addEventListener() который будет обрабатывать событие клика по этому элементу

const sku = document.querySelector(".sku");

if (sku !== null) {
    sku.addEventListener("click", (e) => {

    });
}

Итак, событие клика мы отслеживаем и теперь настало время вызвать в момент клика нашу функцию, которая и будет осуществлять копирование содержимого.

Функцию назовём copyWooSKU()

Что должно находиться в функции? Очевидно, что нам нужно получить (зачитать) значение артикула, а затем его каким то чудесным образом скопировать в буфер обмена пользователя. Реализовывать мы это будем через современный API Async Clipboard (на замену синхронного метода document.execCommand())

Clipboard API предоставляет возможность реагировать на команды буфера обмена (вырезать, копировать и вставить), а также выполнять асинхронные чтение/запись в системный буфер обмена.

https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API

Итак, нам понадобится:

  1. Объект Navigator
  2. Свойство этого объекта .clipboard — которое используется для чтения и записи содержимого буфера обмена
  3. И метод writeText() — для записи текста в буфер обмена
async function copyWooSKU(txt) {
    try {
        await navigator.clipboard.writeText(txt);
    } catch (error) {
        console.error("Ошибочка вышла: ", error);
    }
}

const sku = document.querySelector(".sku");

if (sku !== null) {
    sku.addEventListener("click", (e) => {
        copyWooSKU(e.target.innerText);
    });
}

Ну вот и всё! Это должно работать 🙂

Обращу внимание, что стрелочные функции не имеют собственного контекста this. То есть в стрелочных функциях

e.currentTarget != this

Комментарий к коду:

  • async перед функцией, потому что в теле функции есть await и вернётся промис
  • try / catch для обработки исключения
  • e.target.innerText — это извлечение значения свойства (текста в нашем случае) элемента по которому кликаем

Как и многие новые API, API буфера обмена поддерживается только для страниц, обслуживаемых по протоколу HTTPS. Чтобы предотвратить злоупотребления, доступ к буферу обмена разрешен только тогда, когда страница является активной вкладкой. Страницы на активных вкладках могут записывать в буфер обмена без запроса разрешения, но чтение из буфера обмена всегда требует разрешения.

Учтите, что метод writeText() ожидает безопасного контекста HTTPS и если ваше соединение осуществляется по схеме протокола HTTP то может вылететь как раз таки ошибочка 🙂

Рекомендуется для чтения:

Разблокирование доступа к буферу обмена

Как добавить уведомление?

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

Давайте рассуждать. Нам нужно методами JavaScript создать элемент в котором будет содержаться текст нашего уведомления. После вызова функции необходимо отобразить это уведомление и спустя пару секунд скрыть. Весь наш код теперь выглядит следующим образом:



async function copyWooSKU(txt) {
    try {
        await navigator.clipboard.writeText(txt);
    } catch (error) {
        console.error("Ошибочка вышла: ", error);
    }
}

const sku = document.querySelector(".sku");

if (sku !== null) {
    sku.addEventListener("click", (e) => {

        e.preventDefault();
        copyWooSKU(e.target.innerText);

        const myNotice = document.createElement("span");
        myNotice.style.color = "red";
        myNotice.innerText = "Скопировано";

        // селектор родителя
        if (sku.parentElement) {
          const parentElement = sku.parentElement;
          parentElement.appendChild(myNotice);

          window.setTimeout(function () {
            parentElement.removeChild(myNotice);
          }, 2000);
        } // TODO else 

    });
}

В этом коде использован следующий JavaScript:

  • Метод preventDefault () — добавил на всякий случай для отмены обработки клика (до нашего обработчика)
  • document.createElement() — метод для создания элемента
  • style.color — присваиваем CSS-свойство для изменения цвета шрифта
  • Свойство .innerText — позволяет задавать текст нашему созданному элементу
  • Метод .appendChild() добавляет узел в конец списка дочерних элементов указанного родительского узла. Будьте внимательны! Селектор родительского элемента у вас может отличаться.
  • Функция .setTimeout() — для задержки выполнения
  • Метод .removeChild() удаляет дочерний элемент из DOM.
  • parentElement это родительский элемент текущего узла.

Возможно некоторые свойства, такие как : target, innerText станут понятнее, если мы на них взглянем. Для этого в этом отрезке кода, где мы отслеживаем действие по клику, можно вывести в консоль это событие клика мышкой:


if (sku !== null) {
    sku.addEventListener("click", (e) => 

        console.log(e);

    });
}

Мы увидим объект, и именно в нём и находятся наши свойства:

свойство таргет

А вот свойство со значением артикула, к которому мы обращаемся

Image 00000143 - Как сделать копирование артикула товара по клику в WooCommerce?

Поиграть с рабочим кодом можно тут

Как отобразить вместо пустой цены или «нуля» слово «БЕСПЛАТНО» в WooCommerce?

Задача: Когда цена товара не указана или её значение равно 0 (нулю), то в этом случае выводить слово «БЕСПЛАТНО».

Товар с ценой 0Image 00000081 - Как отобразить вместо пустой цены или «нуля» слово «БЕСПЛАТНО» в WooCommerce?
Было/Стало

Начнём наше решение мы как всегда с исследования. Проинспектируем наш элемент в котором выводится значение цены

Далее, поиском по файлам по директории плагина WooCommerce нам необходимо отыскать «темплэйт» который отвечает за вывод цены. Я его нашёл — price.php

Нас интересует метод (функция) get_price_html(), и следующим шагом мы отыщем её также по директории плагина. Вот так она выглядит:

Нас интересуют два её хука. Это хук-фильтр ‘woocommerce_empty_price_html’ и хук-фильтр ‘woocommerce_get_price_html’. Сама функция возвращает тип данных — строка, это важно отметить.

Как мы видим, первый фильтр нам поможет изменить возвращаемое значение в том случае если цена у товара не указана и оформить нашу функцию можно следующим образом:

add_filter('woocommerce_empty_price_html', function ($string) {

    $string = '<span>Бесплатно</span>';

    return $string;

}, 100, 1);

Если обратить внимание на исходный код метода get_price_html() класса WC_Product, то можно заметить, что строгая проверка там уже стоит на пустую строку. Поэтому в фильтр мы передаём один аргумент, я его назвал $string и присвоил ему новое значение и тут же вернул (это важно! При использовании хуков-фильтров всегда возвращать, то что передали). Цифры после анонимной функции говоря об очерёдности выполнения (так как на этот фильтр может ещё кто-то, например, разработчики стороннего плагина, прикрепить свои функции) и вторая цифра — это число аргументов для передачи. В следующем примере их будет уже два 🙂

Теперь в случае, если цена не указана, будет выводиться слово — Бесплатно

Image 00000081 1 - Как отобразить вместо пустой цены или «нуля» слово «БЕСПЛАТНО» в WooCommerce?

Теперь рассмотрим второй хук, который поможет нам решить задачу во втором случае — когда цена указана значением равным нулю.

Если взглянуть исходный код метода, то можно обнаружить вот такую запись возврата функцией (методом) данных

return apply_filters( 'woocommerce_get_price_html', $price, $this );

Итоговый код будет выглядеть вот так. Сейчас я поясню. С первым аргументом $price думаю всё понятно — это возвращаемая строка цены, а вот второй $this — это объект товара — экземпляр класса которому принадлежит метод, соответственно мне нужно указать его в виде $product — объект товара, который доступен в глобальной зоне видимости (global $product). Немного может показаться это сложным для понимания, но со временем и практикой ясность придёт.

Вобщем, передав вторым аргументом $product, наш фильтр будет обладать данными из этого объекта, а соответственно нам будет доступен метод получения цены. Если взглянуть на исходный код метода, то можно встретить в нём ещё один нужный нам метод получения цены $this->get_price()

Вот итоговый код. Единственное, я понизил строгость проверки 0 == $product->get_price(), так как возвращается строка, а мы сравниваем с типом число и это уже не будет удовлетворять условию и указал последней цифрой после функции передаваемое число аргументов — 2. Так как второй аргумент (объект $product) нам нужен для проверки значения цены равное нулю.

add_filter('woocommerce_get_price_html', function ($price, $product) {

    if (0 == $product->get_price()) { // return string!
        $price = '<span>Бесплатно</span>';
    }

    return $price;
}, 100, 2);

Теперь, если значение цены указано, как ноль, то получим вывод слова «бесплатно»:

Image 00000084 - Как отобразить вместо пустой цены или «нуля» слово «БЕСПЛАТНО» в WooCommerce?

Учтите, это справедливо и для случая если в качестве акционной цены проставлен «ноль»

Image 00000085 - Как отобразить вместо пустой цены или «нуля» слово «БЕСПЛАТНО» в WooCommerce?

Мы так же получим вывод слова «бесплатно».

Обратите внимание, что я возвращаю наше слово в тегах для строчного элемента <span> А это значит, что указав тегу атрибут класса, мы можем менять через CSS стиль отображения данного слова.

Как добавить категорию товаров WooCommerce в меню сайта?

Начинающие пользователи могут быть озадачены добавлением ссылок в меню на созданные ими категории товаров в магазине под управлением WooCommerce и это неспроста. Да, есть некоторые особенности и сейчас мы с вами их рассмотрим.

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

Классический шаблон сайта

Находясь на сайте с правами администратора, вы должны видеть в разделе с названием сайта в выпадающем меню ссылку Меню

В выпадающем меню ссылку Меню

А если вы находитесь непосредственно в панели управления, то этот раздел должен находиться во Внешний вид

Внешний вид

Если вы не видите этого раздела, то вероятнее всего у вас установлена «блочная тема» оформления дизайна сайта и вам следует перейти к этому разделу.

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

меню отсутствует

В этом случае:

  1. дайте название вашему меню
  2. Отметьте область отображения на сайте (в разных темах эти области разные)
  3. Создайте меню
  4. Наполните его ссылками из раздела Элементов меню

И первая неприятность нас подстерегает вот в чём. По умолчанию добавления ссылок категорий товаров скрыты и вы их можете не увидеть в блоке элементов меню.

Нам необходимо их включить. Для этого откроем раздел в верхней правой части экрана Настройки экрана и отметим чекбокс Категории товаров, тем самым включив его в раздел элементов меню

Image 00000044 - Как добавить категорию товаров WooCommerce в меню сайта?

Теперь категории товаров будут доступны нам в разделе конструктора элементов меню

Категории товаров в меню

Теперь отмечаем нужные категории и добавляем в наше меню. Сделаю примечание, что если вам нужно сделать вложенность, то необходимо перетянуть элементы вправо. Примерно должно получиться следующее:

Image 00000046 - Как добавить категорию товаров WooCommerce в меню сайта?

Не забудьте сохранить изменения 🙂

Теперь на лицевой (публичной) части сайта вы увидите созданное меню и добавленные в него ссылки:

Добавления категорий ВуКоммерс в меню сайта

Блочная тема оформления

Если вы используете блочную тему оформления, то в верхней части сайта вы должны видеть ссылку Редактировать сайт

Редактировать сайт

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

После открытия режима редактирования нужно нажать на какую-нибудь область содержимого сайта.

редактирование

После этого загрузится блочный редактор и возможно его загрузка будет сопровождаться вот таким уведомлением:

Image 00000030 - Как добавить категорию товаров WooCommerce в меню сайта?

После загрузки редактора я рекомендую открыть (распахнуть) все элементы страницы в виде иерархического списка, как на примере ниже. Нажмите на специальную иконку и распахните элементы:

Image 00000031 - Как добавить категорию товаров WooCommerce в меню сайта?

Нас интересует Навигация и её список страниц. Выделите Список страниц. Он должен подсвечиваться примерно так. Это говорит что вы выделили Списки страниц (элементов) нужного меню

Image 00000032 - Как добавить категорию товаров WooCommerce в меню сайта?

Далее нажимаем Изменить. Есть вероятность получить подобное уведомление:

уведомление

Этот список страниц синхронизируется с опубликованными страницами на вашем сайте. Отсоедините список страниц, чтобы самостоятельно добавлять, удалять или изменять порядок страниц.

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

Убедитесь, что в режиме редактирования Навигации у вас включена справа область нужного Блока, как в примере ниже:

Редактор Навигации

Теперь мы можем создавать новые ссылки для нашего меню. Нажмите на «плюсик» и при помощи поиска отыщите Категории.

Image 00000035 - Как добавить категорию товаров WooCommerce в меню сайта?

Начните писать название… Вы увидите Блок для построения ссылок из категорий ваших товаров

Поиск категорий

Добавляем и выбираем нужную категорию

Выбрать категорию

Добавляем нужные ссылки:

Image 00000038 - Как добавить категорию товаров WooCommerce в меню сайта?

А также мы можем управлять их вложенностью:

Image 00000039 - Как добавить категорию товаров WooCommerce в меню сайта?

А на публичной части сайта мы получим следующий результат:

Image 00000040 - Как добавить категорию товаров WooCommerce в меню сайта?

Из Панели управления

А из панели управления в разделе Внешний вид будет аналогичная ссылка, правда с другим названием — Редактор:

Image 00000048 - Как добавить категорию товаров WooCommerce в меню сайта?

После вызова редактора вы можете увидеть подобный раздел. Нас интересует Навигация

Image 00000049 - Как добавить категорию товаров WooCommerce в меню сайта?

Далее переходим в её (навигации) редактирование

Image 00000050 - Как добавить категорию товаров WooCommerce в меню сайта?