Как добавить цель «JavaScript-событие» на кнопку «Добавить в корзину» в WooCommerce?

Дано: Интернет магазин под управлением WordPress + WooCommerce.

Задача: Отследить успешное добавление товара в корзину пользователем и передать эту информацию для аналитики в Яндекс Метрику.

Решение: решить подобную задачу можно разными способами: на стороне клиента, исключительно за счёт JavaScript и на стороне сервера — на PHP.

Требования к сайту

При создании цели важно учитывать:

  • Форма должна быть создана с помощью тега form. Если форма сделана через теги div, она отслеживаться не будет.
  • Отправка формы должна выполняться через элементы button type=»submit» и input type=»submit». Если отправка реализована через элемент button type=»button», цель достигаться не будет.
  • Элементы button type=»submit» и input type=»submit» должны находиться внутри элемента form.

Если форма обрабатывается с помощью JavaScript, цель будет работать только для стандартного события onSubmit.

https://yandex.ru/support/metrica/simple-goal/form.html

Так как вёрстка в разных шаблонах оформления может быть разная, то своё решение мы начнём с исследования нашей кнопки в объектной модели документа (DOM), для того что бы понять удовлетворяет ли наш сайт описанным условиям.

кнопка добавить в корзину

Мы видим элемент кнопки (button) и наличие атрибутов, которые могут помочь «зацепиться» за этот элемент и «повешать» на него нужное нам событие. Также наша кнопка находится в теге <form> , что говорит о соответствии условиям описанных в документации Яндекс Метрики.

Забегая вперёд отмечу, что для точности передачи данных лучше вешать это событие на отправку формы, а не на клик по кнопки (хотя для некоторых задач подойдет именно клик, например, когда вы хотите просто проверить интерес к чему либо, к новому разделу на сайте).

Пример того, как делать не стоит!

<form action="" method="POST" type="submit">

    <input name="name" placeholder="Ваше имя" required> <br>

    <input type="email" name="mail" placeholder="Ваш email" required> <br>

    <input type="button" onclick="yaCounterXXXXXX.reachGoal('form2'); return=true;" value="Отправить">

</form>

В этом случае в Метрику будет отправлена информация по всем кликам, совершенным по кнопке “Отправить” — даже если посетитель не заполнил форму.

https://yandex.ru/blog/metrika-club/kak-pravilno-nastroit-reachgoal-v-formakh

Добавление цели в Яндекс Метрики

Первым делом, нам нужно создать цель в личном кабинете Яндекс Метрики:

1. добавляем цель

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

2. Выбираем JavaScript-событие

Готово! Часть задачи мы выполнили. В личном кабинете Яндекс Метрики создана наша цель:

цель события добавления в корзину

Решение на JavaScript

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

В качестве селектора (выбираемого из DOM элемента) у нас выступает тег form с классом «cart». Наш скрипт может выглядеть примерно так:

Вариант №1

document.addEventListener("DOMContentLoaded", (event) => {
    const cartForm = document.querySelector("form.cart");

    if(cartForm){
        cartForm.addEventListener('submit', function () {
            ym(XXXXXX, 'reachGoal', 'TARGET_NAME');
        });
    }
});
  • XXXXXX — номер вашего счетчика.
  • TARGET_NAME — идентификатор цели.

Пояснение: мы получили наш элемент формы и наблюдем через подписку на событие submit за её успешной отправкой (добавление в корзину — это и есть в нашем случае отправка формы)

Вариант №2

...
<form action="" method="get" onsubmit="ym(XXXXXX, 'reachGoal', 'TARGET_NAME'); return true;">
    ...
</form>
...

Если приглядеться к примеру указанному на сайте Яндекс Метрике, то мы можем заметить, что можем разместить вызов функции Яндекс Метрики (ym) прописав его в атрибут onsubmit нашей формы добавления товара в корзину.

В этом случае наш код немного изменится:

document.addEventListener("DOMContentLoaded", (event) => {
    const cartForm = document.querySelector("form.cart");

    if(cartForm){
        cartForm.setAttribute("onclick", "ym(XXXXXX, 'reachGoal', 'TARGET_NAME'); return true;");
    }
});
  • XXXXXX — номер вашего счетчика.
  • TARGET_NAME — идентификатор цели.

Ну вот и всё!

Если вы всё сделали правильно, то при исследовании элемента непременно должны увидеть добавленный атрибут (справедливо для варианта №2)

добавлен атрибут к тегу form

Теперь в Яндекс Метрике, в разделе Конверсии, мы можем ожидать результат её выполнения:

Конверсии

Вот так выглядит выполнение скрипта (цель отработала):

Цель отработала

Обращу внимание, что можно было воспользоваться методом автоматического добавления цели «Отправка формы»:

автоматическое добавления цели

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

автоматическая цель
Image 00000160 - Как добавить цель «JavaScript-событие» на кнопку «Добавить в корзину» в WooCommerce?

На этом всё! Парам-Парам-Пам!

eralash - Как добавить цель «JavaScript-событие» на кнопку «Добавить в корзину» в WooCommerce?

Как установить минимальную сумму корзины для заказа в Woo?

Задача: ограничить возможность заказа пользователя определённой суммой товаров в корзине.

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

уведомление из корзины

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

уведомление на странице оформления заказа

Решение: просто добавьте этот php-сниппет и укажите в виде числового значения минимальную сумму для осуществления заказа:

/**
 * Set a minimum order amount for checkout
 */
add_action('woocommerce_checkout_process', 'wc_minimum_order_amount');
add_action('woocommerce_before_cart', 'wc_minimum_order_amount');

function wc_minimum_order_amount()
{
    // Установите цифру минимального значения для осуществления заказа
    $minimum = 100;

    if (WC()->cart->total < $minimum) {

        if (is_cart()) {

            wc_print_notice(
                sprintf('Ваша сумма заказа %s — вы должны дополнить до минимума в %s чтобы оформить заказ.',
                    wc_price(WC()->cart->total),
                    wc_price($minimum)
                ), 'error'
            );

        } else {

            wc_add_notice(
                sprintf('Ваша сумма заказа %s — вы должны дополнить до минимума в %s чтобы оформить заказ.',
                    wc_price(WC()->cart->total),
                    wc_price($minimum)
                ), 'error'
            );

        }
    }
}

Источник сниппета «Minimum Order Amount»

Постоянный кэш объектов в WordPress без Redis и Memcached

Если не вдаваться в долгие разъяснения, о системе кеширования в WordPress, а попытаться объяснить просто и кратко, то своё пояснение я начал бы с того, что есть некий механизм, который способен снять нагрузку с сервера (место где работает сайт) и тем самым ускорить ваш веб-сайт под управлением WordPress.

Механизм этот называется — кеширование. Принцип работы достаточно простой. Кеширование позволяет использовать готовые сформированные данные, а не генерировать их при каждом повторном обращении к страницам сайта.

Кэш страниц (Page cache)

Чтобы понять суть этого вида кэширования, давайте рассмотрим простой пример. Возьмём этот сайт. Предположим Вася попадает на эту страницу. На сервере (на back-end) происходит много скрытых, невидимых глазу посетителя процессов: обработка запроса, формирования заголовков ответа, выборка данных из базы данных, выполнение логики и вычислительных операций PHP и прочее. В итоге формируется страница, которая должна вернуться в браузер Васи в виде HTML для отрисовки. Сервер получил нагрузку выполняя эту подготовку. Через минуту эту же страницу посещает Петя. Что происходит? Снова происходят те же самые процессы: выборка и обработка данных для формирования страницы, чтобы отправить Пете в браузер. А через пару минут эту страницу посещает девочка Катя. Ну вы догадались что произойдёт, да? 🙂

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

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

Включен полный страничный кэш

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

Далее заходить на эту страницу сайта Вася. Догадались что будет происходить? Да! Сервер отдаст готовый вариант этой страницы и не будет заново её формировать.

Теперь на время жизни этого кэша всем посетителям сайта будет отдаваться сформированный результат и как следствие — это выигрыш в скорости работы сайта, повышение его производительности за счёт короткого отклика (так как страница уже сформирована) и снятие вычислительной нагрузки.

WordPress не наделён этим механизмом «из коробки» (то есть после установки и первого запуска). Реализовать такое кеширование помогут плагины, такие как:

  • WP Super Cache
  • W3 Total Cache
  • WP Rocket (платный)

Объектный кэш в WordPress

Но в этой статье мы будем говорить об объектном кэшировании в WordPress, которое, кстати, так же «из коробки» является непостоянным. Проиграем опять ситуацию. Заходит на страницу сайта Петя, происходит формирование страницы. И объектный кэш это другой уровень кеширования. На уровне страниц пример был рассмотрен выше и если вы были внимательны, то вспомните что при формировании страницы данные берутся из Базы Данных, то есть происходит, если выражаться техническим языком, их SQL запрос. Представим что запрос был сложный и данные запрашивались из БД по разным критериям (параметрам).

Да, в WordPress есть механизм объектного кэширования в рамках сеанса запрошенной страницы. Предположим, функция get_option() вызывается в рамках страницы 10 раз. Если провести аналогию с кэшированием страниц, то после первого вызова она попадёт в объектный кэш и последующие её вызовы будут уже обслуживаться из встроенного объектного кэша WordPress. Вроде всё классно, неправда-ли? Но что произойдёт если на эту страницу зайдет Вася? Функция get_option() снова будет запрашивать данные и в пока Вася находится на странице и не переходит на другие всё будет хорошо и последующие её вызовы будут обслуживаться из кэша.

Вот это и есть непостоянный объектный кэш. Но нам хотелось бы и это уже само напрашивается, чтобы для новых посетителей сайта не происходили одинаковые запросы из БД, а при повторном запросе данные были взяты из памяти, а не заново формировались ( как по аналогии со страницами).

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

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

Кейс (реальный случай)

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

Когда Redis не доступен

Как же быть в этом случае?

Плагин Docket Cache

Страница для скачивания плагина.

Docket Кэш — это плагин для реализации постоянного кеша объектов в WordPress, который хранится в виде PHP-кода. Задача плагина предоставить альтернативный вариант для постоянного объектного кэша для тех, кто не может использовать на своих серверах такие сторонние решения, как: Redis или Memcached.

После активации плагина нам становятся доступны его разделы настроек:

Плагин Docket Cache

Принцип работы плагина отличается от популярных решений, таких как Redis или Memcached, а также Docket Cache не использует механизм сериализации/десериализации объектов PHP для хранения в файлах в виде строк, а сохраняет данные путем преобразования объекта в простой PHP-код, что приводит к более быстрому извлечению данных и повышению производительности при включенном Zend OPcache.

Что такое Zend OPcache?

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

Docket Cache преобразует кэш объектов в простой PHP-код. При чтении и записи кеша он будет напрямую использовать OPcache, что приводит к более быстрому извлечению данных и повышению производительности.

У плагина много всяких настроек доступных в разделе Configuration, включите некоторые из них:

настройки плагина

В разделе Обзор можно увидеть статистику кеширования — это хороший знак, значит плагин работает 🙂

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

Требования

Для использования Docket Cache нужно выполнить минимальные требования:

  • PHP 7.2.5
  • WordPress 5.4
  • Zend OPcache

Естественно все тонкости и настройки рассматривать смысла я не вижу. Главное что бы ваш сервер и его ПО удовлетворял минимальным требованиям и после активации плагина появлялись файлы, статистика кэша. Для начала это уже будет неплохо 🙂

Вот так хранится кэш на сервере. Это директория для хранения.

кэш на сервере

А вот файлы и их содержимое

Image 00000138 - Постоянный кэш объектов в WordPress без Redis и Memcached

Хранятся данные в виде массивов в синтаксисе PHP

Image 00000139 - Постоянный кэш объектов в WordPress без Redis и Memcached

Для технических специалистов возможно будет полезна эта ссылка на документация плагина

Подытожим об объектном кешировании

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

Кэшированный объект будет оперативно обслуживаться из кеша, а не отправлять несколько запросов в базу данных. Это более эффективно и снижает огромную ненужную нагрузку на ваш сервер.

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

Как сделать кнопку (ссылку) «вернуться назад» в WordPress?

Задача: при нажатии на эту кнопочку возвращать пользователя на предыдущую страницу.

Реализация на JavaScript

За отрисовку кнопки, как элемента HTML, отвечает эта строка:

<button id="go-back">Вернуться назад</button>

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

const button = document.createElement("button");
button.setAttribute("id", "go-back");
button.innerText = "Вернуться назад";
button.type = "submit";
document.body.appendChild(button);

А за функционал на стороне клиента вот этот сниппет на JavaScript, который прослушивает событие клика по элементу с идентификатором «go-back» и вызывает на это событие метод back() принадлежащий интерфейсу History, который предписывает браузеру вернуться на одну страницу назад в истории сеанса.

document.getElementById("go-back").addEventListener("click", () => {
  history.back();
});

Посмотреть код в действии можно тут.

@TODO По доброму ещё можно сделать проверку на существование значения «реффера» и принадлежности к текущему домену.

Мы рассмотрели механизм решения данной задачи на стороне клиента (браузера) при помощи JavaScript. Теперь давайте рассмотрим вариант на стороне сервера, при помощи PHP:

Реализация на PHP

В контексте WordPress, на стороне сервера подобное можно реализовать при помощи функции WP из ядра, которая является обёрткой других функций.

wp_get_referer()

Ознакомиться с функцией можно тут

Под капотом функции у нас происходит проверка на принадлежность URL к текущему домену сайта, возвращает строку или в противном случае булев тип false

Реализацию кода выше на стороне сервера можно представить вот в таком виде:

<?php
$return_url = wp_get_referer();

if ($return_url) { ?>
    <a class="button" href="<?php echo esc_url($return_url); ?>">Вернуться назад</a>
<?php }

Начинающих пользователей могут смутить открывающие и закрывающие теги PHP, часто в этом допускают синтаксическую ошибку. Ниже привожу пример где я вывел обработку (функцию отчистки) URL из атрибута href, тем самым позволив исключить теги PHP:

// получаем реферальную ссылку
$return_url = wp_get_referer();

// если не false продолжаем ...
if ($return_url) {
    // обработка УРЛ (подготовка)
    $url = esc_url($return_url);

    // вывод
    echo"<a class='button' href='{$url}'>Вернуться назад</a>";
}

P.S. тоже «не сахар» вариант 🙂 Будьте внимательнее с кавычками. Чтобы в строке языковой конструкции echo у нас выводилась переменная с нашим УРЛ, необходимо убедиться что сама строка в двойных кавычках, а атрибуты элемента ссылки в одиночных!

Небольшим преимуществом серверного метода можно считать тот факт, что если у клиента будет выключен в браузере JavaScript или возникнут ошибки которые не дадут отработать первому решению (на JS), то наша кнопка всё равно окажется в DOM так как приходит с сервера, а не формируется на стороне клиента.

Как отследить, сохранить все электронные письма, отправленные с сайта на WordPress? 

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

После установки, плагин достаточно только активировать и он незамедлительно приступит к работе и встанет на стражу e-mail транспорта.

раздел плагина в меню

Какая информация регистрируется?

Все электронные письма, отправленные с вашего сайта WordPress теперь, после активации плагина, будут протоколироваться.

А вот информация, которая сохраняется:

  • Тема письма
  • Содержимое электронной почты (HTML или текст)
  • Вложения электронной почты
  • Заголовки электронной почты (кому, от кого, кому ответить, копия, скрытая копия)
  • Сообщение об ошибке (в случае, если при попытке отправить электронное письмо произошла ошибка)
  • IP-адрес исходного сервера (нужно включить в настройках)
  • Дата и время письма
  • Получатель (адрес электронной почты)

Сейчас мы оформим заказ в магазине WooCommerce и посмотрим что отловит наш плагин для сохранения

Заказ в интернет-машазине

Теперь в разделе журнала плагина мы можем наблюдать фиксацию данного события. Оформление заказа вызвало три события отправления электронных писем:

Вот панель для действий над письмами. Мы можем заново вызвать отправку выборочного письма, удалить или же жмакнуть на «глазик» и посмотреть тело письма которое получаем мы, как администратор сайта и какое получает клиент. Иногда это очень полезно 🙂

Image 00000126 - Как отследить, сохранить все электронные письма, отправленные с сайта на WordPress? 

Письмо менеджерам интернет-магазина:

Письмо менеджерам интернет-магазина:

А вот такое письмо получают клиенты интернет-магазина:

Image 00000125 - Как отследить, сохранить все электронные письма, отправленные с сайта на WordPress? 

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

Дополнительные настройки

В настройках плагина можно включить

  • Хост — Отображение IP-адреса хоста, на котором работает WordPress. Это полезно при запуске WP Mail Logging на нескольких серверах одновременно.
  • Отображение вложений (файлов) — Отображение вложений в таблице журнала.
настройки плагина

Учтите, что этот плагин сохраняет только путь к файлу вложений, а не сам файл вложений. Если путь к файлу вложения не существует или файл был удален, он не будет отображаться в журналах.

А после включения хоста, в нижней части превью письма вы можете увидеть «айпишник» с которого было отправление:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Удачи!

Что такое Akismet или как быстро защитить сайт на WordPress от СПАМа?

Akismet — это служба, которая фильтрует спам в комментариях, обратных ссылках и сообщениях контактной формы на сайтах под управлением WordPress.

Данный плагин это одно из самых надежных решений для защиты от спама для WordPress и WooCommerce.

Akismet проверяет ваши комментарии и отправленные контактные формы по нашей глобальной базе данных спама, чтобы предотвратить публикацию вредоносного контента на вашем сайте. Вы можете просмотреть спам в комментариях, который он улавливает, на экране администратора вашего блога «Комментарии».

Плагин доступен сразу после установки WordPress. Чтобы его задействовать нужно его активировать и пройти регистрацию на официальном сайте, после которой вам будет выдан ключ, который нужно активировать в настройках плагина.

Основные функции Akismet:

  • Автоматически проверяет все комментарии и блокирует те, что похожи на спам.
  • Каждый комментарий имеет свою историю статусов, благодаря которой можно легко проверить, какие комментарии были заблокированы или одобрены Akismet, а какие были помечены как спам или не спам модератором.
  • Адреса ссылок отображаются прямо в теле комментария, чтобы выявить скрытые или вводящие в заблуждение ссылки.
  • Модераторы могут посмотреть количество одобренных комментариев для каждого пользователя.
  • Функция сброса, которая блокирует наихудшие спам комментарии, поможет вам сохранить ваше место на диске и ускорить работу сайта.
Image 00000101 - Что такое Akismet или как быстро защитить сайт на WordPress от СПАМа?

После активации вам будет предложено получить ключ API Akismet.com, чтобы использовать его. Ключи бесплатны для личных блогов; платные подписки доступны для предприятий и коммерческих сайтов.

Официальный сайт сервиса

Тут нам необходимо выбрать бесплатную подписку (если вы желаете получить продукт бесплатно)

получить продукт бесплатно

Далее огорчим смайлик, суммой со значением «0» и примем условия для использования сервиса

Image 00000103 - Что такое Akismet или как быстро защитить сайт на WordPress от СПАМа?

И наш ключ получен!

ключ акисмет

Теперь вернемся на наш сайт и задействуем полученный ключ. После его активации служба Akismet активна и готова бороться со спамом. Статистика спама на вашем сайте будет отображаться на специальной странице настроек.

Статистика спама на вашем сайте будет отображаться здесь.

Теперь формы комментариев на сайте защищены сервисом Akismet

Akismet

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

Если вы используете конструктор форм Contact Form 7 , то рекомендую ознакомиться с информацией, о том, как защитить формы этого плагина при помощи Akismet.

Прочие плагины

Как проверить и убедиться, что Akismet работает?

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

  • Имя: akismet-guaranteed-spam
  • Электронная почта: akismet-guaranteed-spam@example.com
  • Тело комментария: akismet‑guaranteed‑spam

В поле для комментариев указывайте исключительно akismet-guaranteed-spam и ничего более! Вот пример:

пример заполнения формы

Если всё настроено у вас верно, то после отправления формы со строго указанными, как в примере данными в разделе СПАМ ждите гостей 🙂

СПАМ

Вот он, голубчик. Попался!

попался спам

Как в 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;
}

Как включить регистрацию на сайте и назначить роль пользователю в WordPress по умолчанию?

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

Image 00000095 1 - Как включить регистрацию на сайте и назначить роль пользователю в WordPress по умолчанию?Image 00000094 - Как включить регистрацию на сайте и назначить роль пользователю в WordPress по умолчанию?
Регистрация на сайте ВКЛ/ВЫКЛ

Как включить регистрацию на сайте в WordPress?

Для этого пройдите в раздел Настройки > Общие и отметьте нужный чекбокс

После этого при входе на сайт, под формой появится одноимённая ссылка Регистрация

Регистрация аключена

Роли пользователей в WordPress

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

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

Стандартная установка WordPress включает несколько предопределенных ролей:

  1. Администратор (administrator): это основная роль, которая имеет полный доступ ко всем функциям и настройкам сайта. Администратор может управлять другими пользователями, устанавливать и настраивать плагины и темы, редактировать контент и т.д.
  2. Редактор (editor): редакторы могут создавать, редактировать и публиковать контент на сайте. Они также имеют возможность управлять контентом, созданным другими пользователями, но не могут изменять настройки сайта или устанавливать плагины.
  3. Автор (author): авторы могут создавать и редактировать свой собственный контент, но не имеют доступа к контенту других авторов или возможности управлять настройками сайта.
  4. Участник (contributor): участники могут оставлять комментарии на сайте, но не имеют возможности создавать или редактировать контент.
  5. Подписчик (subscriber): подписчики могут только просматривать контент и подписываться на обновления.

После установки WordPress автоматически создается учетная запись администратора.

Как установить роль при регистрации новых пользователей?

Роль по умолчанию для новых пользователей назначается с минимальными возможностями, по сути их даже нет. Эта роль называется — Подписчик и может быть изменена в разделе Настройки > Общие

Изменение роли при регистрации нового пользователя

Внимание! Будьте внимательны при включении Регистрации. Убедитесь какая роль будет присваиваться при регистрации нового пользователя. Неверно указанная роль может обернуться катастрофой на вашем сайте.

Подробнее о возможностях и ролях можно узнать тут или тут.

Как сделать копирование артикула товара по клику в 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 стиль отображения данного слова.

Как изменить цвет текста в редакторе Гутенберг в WordPress?

Чтобы выборочно изменить текст, например, некоторых слов, необходимо выделить нужное их количество и в разделе дополнительных возможностей, доступ к которым мы получаем по клику на эту стрелку (действие на рисунке №2) выбрать Выделение, а затем указать цвет из заготовок или произвольно

меняем цвет слов
меняем цвет слов

В результате получаем:

выделение цветом слова

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

Image 00000074 - Как изменить цвет текста в редакторе Гутенберг в WordPress?

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

шестнадцатеричной системе