Задача: Когда цена товара не указана или её значение равно 0 (нулю), то в этом случае выводить слово «БЕСПЛАТНО».
Начнём наше решение мы как всегда с исследования. Проинспектируем наш элемент в котором выводится значение цены
Далее, поиском по файлам по директории плагина 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 и присвоил ему новое значение и тут же вернул (это важно! При использовании хуков-фильтров всегда возвращать, то что передали). Цифры после анонимной функции говоря об очерёдности выполнения (так как на этот фильтр может ещё кто-то, например, разработчики стороннего плагина, прикрепить свои функции) и вторая цифра — это число аргументов для передачи. В следующем примере их будет уже два 🙂
Теперь в случае, если цена не указана, будет выводиться слово — Бесплатно
Теперь рассмотрим второй хук, который поможет нам решить задачу во втором случае — когда цена указана значением равным нулю.
Если взглянуть исходный код метода, то можно обнаружить вот такую запись возврата функцией (методом) данных
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);
Теперь, если значение цены указано, как ноль, то получим вывод слова «бесплатно»:
Учтите, это справедливо и для случая если в качестве акционной цены проставлен «ноль»
Мы так же получим вывод слова «бесплатно».
Обратите внимание, что я возвращаю наше слово в тегах для строчного элемента <span>
А это значит, что указав тегу атрибут класса, мы можем менять через CSS стиль отображения данного слова.