vorst.ru - Как написать short-code класс для WordPress
Статьи из рубрики root

Как написать unique валидатор

Пример валидатора для серверной и клиентской частей

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

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


Интерфейс для полнотекстового поиска

Использование ElasticSearch во frontend

На создание ElasticSearch индекса понадобилось совсем не много усилий, как видно из предыдущей статьи. Чтобы сделать индекс доступным конечному пользователю, усилий понадобиться не многим больше.

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


Как создать индекс ElasticSearch

Полнотекстовый поиск

Один парень написал: "Нужно сделать поиск слов в таблице "articles" по столбцу "content". В результатах поиска сначала выводить те, которые содержат наибольшее количество слов в статье и далее по мере уменьшения."

Мысль летит) Но ясно, что нужен полнотекстовый поиск.


Рефакторинг кода авторизации

Использование аккаунта социальной сети для авторизации

Авторизация с помощью социальной сети не должна зависеть от типа аккаунта. В предыдущем посте используется код, где в конструкторе классa common/components/SocialContact.php выполняется оператор switch. При добавлении обработчика для новой социальной сети, придется дописывать код, при этом меняя класс.

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


Как подключить авторизацию через аккаунт

OAuth2 авторизация с использованием аккаунта

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


Модерация и вывод комментариев

Ответ на комментарии и рекурсивный вывод

На сайте оставили комментарий, вы ответили. Оппонент что-то еще уточнил, вы опять ответили. Цепочка из нескольких вопросов/ответов, которую нужно представить в виде лестницы.

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


Модуль для управления блогом

Блог включает управление комментариями, пользователями, rbac

Новости, сообщения, описания - это все статьи, а статьи - это блог. Блог является важной составляющей любого сайта.

Блог настолько важен, что самая популярная CMS на планете WordPress - это блог.

Во фреймворке блог пишется самостоятельно или используется готовый модуль. Или сначала пишется самостоятельно, а потом переписывается как модуль.


Как написать виджет для WordPress

Пример виджета для WordPress

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

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


Как написать short-code для WordPress

Пример написания short-code для WordPress

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

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


Как написать плагин для WordPress

Плагин для WordPress подсчета цены по компонентам

Любой товар состоит из элементов. Довольно часто производитель, поставив задачу написать электронный магазин, позволяет выбирать комплектацию заранее, до производства. Выбирая комплектующие есть возможность сэкономить или наоборот, согласиться с утверждением "Я этого достоин(а)" и заказать по полной.

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

Но это отвлеченный пример, а был конкретный - Demo, Plugin.


Как определить правило для RBAC

Выполнять действие или нет

В предыдущей статье были определены две роли - Админ и Автор, как в обычном блоге. А обычно блог используется при создании любого сайта. Для ролей Админ и Автор были определены разрешения.

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


Определение разрешений на доступ и ролей для пользователей

Задание доступа только к определенным действиям

Разработка бекенда сайта часто подразумевает ограничение прав при редактировании контента.

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


Как подключить RBAC

Подключение ролевого доступа

В большом количестве задач необходимо в backend-части приложения разрешать одним группам пользователей выполнять только определенные действия. Другим может быть разрешено чуть больше. И так далее, до админа.

Именно распределение прав для групп пользователей и будет рассмотрено в паре-тройке статей. В качестве примера будет использоваться всего две роли.


Как отсортировать картинки мышкой

Сортировка строк мышкой

Василий оставил комментарий в конце января: "Напишите, пожалуйста, статью, как массово загружать изображения через ajax с возможностью сортировки перетаскиванием."

Речь о расширении yii2-byone-uploader, которое может загружать, сжимать, обрезать картинки для любой модели. Я писал о нем уже пару раз.

На тот момент этой функциональности не было. Собирался я долго. Но вот, наконец добавил требуемое. Теперь спешу написать несколько слов о процессе. Демо (при редактировании).


Как подключить кеширование

Ускорение работы сайта с помощью кеширования

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

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


Пример написания WordPress плагина для недвижимости

WordPress плагин для агентств недвижимости

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

Чтобы разобраться, как это возможно, я решил написать плагин для агенств недвижимости. Расширять структуру данных не хотелось - это уже будет не WordPress. Решил сохранять JSON-определения объектов недвижимости в поле post_content и преобразовывать эти определения "на лету" - Demo, GitHub


Пример работы с amoCRM

Как получить данные из amoCRM

Заказчик попросил вывести данные о сделках в таблицу в формате CSV. Данные должны быть максимально полными.

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

Ну и прочее - кто, когда, с кем, контакты клиента и, наконец, все комментарии к сделке.


Как определить и вызвать событие

Пример события

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

В первом случае обработчик события один, во-втором их несколько. Но принцип один - наступило событие, надо действовать.


Пример загрузки контента без перезагрузки страницы

Динамическая загрузка контента

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


Пример работы с сессией

Если читатель хочет вспомнить, что просмотрено и прочитано

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



Поиск



Как написать short-code для WordPress

Пример написания short-code для WordPress

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

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


    Поделиться

Для подобных задач в WordPress есть механизм short-code. При создании сайта или в процессе развития сайта в страницу или пост вставляется специальный код. Если есть зарегистрированные коды, страница проходит проверку. Если код обнаружен, то вызывается обработчик. Результатом работы обработчика является html код, который вставляется на место short-code.

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

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

class LisetteCCApplication
{
  private $name = 'questionnaire'; // file name of a questionnaire
  private static $questionnaire; // questions and answers
  public function __construct($param) {
    $this->name = $param['name'];
    if ( !is_admin() ) {
      add_action( 'plugins_loaded', [ $this, 'plugins_loaded'] );
      // register shortcode
      add_shortcode('cost_calculator', [$this, 'cost_calculator_handler']);
    }
  }
  public function plugins_loaded() {
    // load questionnaire
    self::$questionnaire = require(dirname(__FILE__) . '/config/' . $this->name . '.php');
  }
}

Обработчик должен возвращать html код. В нашем случае это форма содержащая список полей ввода <input type="radio"> на основе self::$questionnaire.

class LisetteCCApplication
{
  ...
  public function cost_calculator_handler($atts = '') {
    // show questionnaire
    $out = '<div id="cost-calculator">';
    $out .= '<form id="questionnaire-form" action="#" method="post">';
    $out .= $this->show(self::$questionnaire['items']);
    $out .= '<div class="error"></div>';
    $out .= '<input type="submit" value="'. __('Calculate', 'lcc') .'" class="btn-calculate">';
    $out .= '</form>';
    $out .= '</div>';
    return $out;
  }
}

Поля ввода формирует метод show, последовательно проходя по дереву вопросника начиная с корня. Сначала выводятся все вопросы с текущего уровня. Если есть еще уровень, то он рекурсивно выводится следом, в блоке с классом dependent. Таким образом выводится все дерево.

После вывода, все уровни, кроме самого верхнего, скрываются с помощью JavaScript. Тут и пригождается класс dependent.

class LisetteCCApplication
{
  ...
  public function show($items) {
    $out = '';
    foreach($items as $var => $item) {
      $out .= '<div id="'. $var .'" class="question-answers">';
      $out .= '<h3>'. $item['question'] .'</h3>';
      // first - show all answers (inputs)
      $i = 0; $value = [];
      foreach($item['answers'] as $answer) {
        $value[$i] = isset($answer['value']) 
          ? $answer['value'] 
          : 0;
        $out .= $this->option($var, $i, $value[$i], 
          $answer['image'], $answer['caption']);
        $i++;
      }
      //second - recursively show dependent block if exist
      $i = 0;
      foreach($item['answers'] as $answer) {
        if(isset($answer['items']))
          $out .= '<div id="'. $var . '-' . $i .'" class="dependent">' . $this->show($answer['items']) .'</div>';
        $i++;
      } 
      $out .= '</div>';
    }
    return $out;
  }
}

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

class LisetteCCApplication
{
  ...
  public function cost_calculator_handler($atts = '') {
    // show result if exists
    $out = $this->get_results();
    // show questionnaire
    ...
  }
}

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

Чтобы short-code можно было использовать, нужно подключить класс LisetteCCApplication к WordPress. Для этого используется специальный файл, который определяет plugin - его описание, автора и прочее и создает экземпляр только что написанного класса.

<?php
/*
Plugin Name: Lisette Cost Calculator
Plugin URI: http://lisette.vorst.ru
Description: Product cost calculator
Author: Sergey Morozov
Author URI: http://vorst.ru
License: MIT
Version: 1.0
Text Domain: lcc
Domain Path: /languages
*/
define('СOST_CALCULATOR_VERSION', '1.0');
define('СOSTCALCULATOR__DOCUMENT_ROOT', dirname(__FILE__));
require_once 'LisetteCCApplication.php';
function cost_calculator_activate() {
  // Do somethig once, when the plugin is activated.
}
register_activation_hook(__FILE__, 'cost_calculator_activate');
try {
    $application = new LisetteCCApplication(['name' => 'questionnaire-test']);
} catch (Exception $e) {
    echo $e->getMessage();
}

Теперь можно активировать plugin в административной панели. Как это работает вы уже видели, но все же Demo.

Следующая задача - написать widget. Нам нужно место на экране, где будет отображаться текущая цена. Об этом в следующей статье.

Заключение

Чтобы short-code мог быть обработан, нужен класс. В классе нужно определить метод-регистратор и метод-обработчик. Метод-регистратор сообщает WordPress, что появился обработчик. Метод-обработчик заменяет short-code на html код.

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

Leave a comment

Only authorized users can leave comments. Please log in or pass a registration.