Содержание:
- Введение
- Минимальная структура файлов для дополнения
- Другие файлы для дополнений
- Наша структура файлов
- Подключаем .js .css правильно. Поддержка минимизации WP-Recall
- Ajax в WP-Recall
- Подчищаем за собой – файл: delete.php
Введение:
Прежде чем приступить к дальнейшему чтению - вам потребуется знать и уметь:
1. "Создаем свое дополнение для Wp-Recall, выводим свою вкладку в личном кабинете"
2. "Ajax в WordPress"
+ начальные знания по js/php (знание синтаксиса). Если эти знания у вас отсутствуют - не отнимайте в комментариях время, задавая элементарные вопросы - обратитесь к гуглу. Цель данного руководства помочь новичкам разобраться с разработкой под плагин WP-Recall и упростить некоторые задачи.
Что будет делать наше дополнение: Слева, по клику на кнопке передадим данные на сервер, увеличим на 1, запишем в БД, и вернем итоговый результат.
Исходники этого урока вы можете посмотреть скачав дополнение "Give a Smile" - именно его в этом уроке мы и будем создавать.
Оно же, по MIT лицензии, доступно в моём git-репозитории
Минимальная структура файлов для дополнения:
Чтобы плагин WP-Recall увидел наше дополнение на странице дополнений плагина в админке, и при включении дополнения мы получили его работу, необходимо следующее:
1. Без пробелов создать папку give-a-smile по следующему пути:
ваш-сайт/wp-content/wp-recall/add-on/
Получится так:
ваш-сайт/wp-content/wp-recall/add-on/give-a-smile/
В дальнейшем, папка give-a-smile – будет являться идентификатором (ID) дополнения.
Например id применяются для такой проверки
2. В корне создать 2 файла в кодировке UTF-8 (без BOM) - info.txt и index.php
info.txt – файл с информацией о дополнении. Информация оттуда используется в админке: на странице "Дополнения", "Репозиторий", при проверке обновлений, на сайте CodeSeller.ru, и по работе с его API (например я это API использовал в дополнении Seller on Codeseller). Как мы видим это очень важный файл.
Его содержимое:
Name: Give a Smile; Version: 0.1; Support Core: 15.9.7; Description: Просто подари улыбку; Author: Владимир Дружаев (Otshelnik-Fm); Author URI: http://across-ocean.otshelnik-fm.ru/; Add-on URI: https://codeseller.ru/products/give-a-smile/;
- здесь все просто:
Name – Имя дополнения.
Version - текущая версия, необходимо чтобы пользователи узнавали о обновлениях.
Support Core – с какой версией WP-Recall точно работает. Не младше.
Description – Описание дополнения
Author – Автор дополнения
Author URI – сайт автора
Add-on URI – адрес дополнения
И файл:
index.php – исполняемый php файл.
Это были два обязательных файла.
Другие файлы для дополнений:
Кроме них, иногда полезны следующие файлы, которые может использовать плагин WP-Recall:
activate.php - срабатывает единожды, в момент активации дополнения. Например предустановка начальных настроек, создание таблиц в БД
deactivate.php - срабатывает единожды, в момент деактивации дополнения.
delete.php - срабатывает единожды, в момент удаления дополнения. Подчищаем за собой (правило хорошего тона в программировании)
readme.txt - Разметка readme-файла для товара - при публикации товара на сайте CodeSeller.ru
Структура файлов нашего дополнения:
Для работы нашего дополнения я создал такую структуру файлов:
scripts.js в папке inc – там будет работать наш ajax.
В корне дополнения у меня находится readme.md - файл для гитхаба (его я описывать не буду), и стилевой style.css файл. Остальные файлы описаны выше.
Как заполнить info.txt - я указал выше.
Подключаем .js .css правильно. Поддержка минимизации WP-Recall:
Плагин WP-Recall использует собственную систему регистрации и объединения файлов с 15-й версии (это улучшенная реализация функций регистрации стилей и скриптов из ядра вордпресс). Это значит что js и css файлы объединяются в один (если в основных, расширенных, настройках WP-Recall включена эта опция), переносы строк и пробелы там убираются – небольшую минимизацию он проводит. Это удобней чем использовать стандартные вордпресс функции регистрации стилей и скриптов.
Итак функции:
rcl_enqueue_style - подключает css файл
rcl_enqueue_script - подключает js файл
и их вешаем на хук rcl_enqueue_scripts
Подключаем:
// подключим стили и скрипт
function gas_resource(){
rcl_enqueue_style('gas_style',rcl_addon_url('style.css', __FILE__));
rcl_enqueue_script('gas_scripts', rcl_addon_url( 'inc/scripts.js', __FILE__ ),false,true);
}
if(!is_admin()){ // в админке они нам не нужны
add_action('rcl_enqueue_scripts','gas_resource',10); // в момент срабатывания хука
}
- в момент срабатывания хука rcl_enqueue_scripts мы подключаем наши стили и файл скриптов, проверяя выше что мы не в админке.
Ajax в WP-Recall
Чтобы понять разницу между работой в вордпресс и wp-recall с ajax, вам нужно знать (и уметь) как вордпресс работает с ajax и как правильно работать в фронтенде с ним. Вначале я уже давал ссылку на подробные доки
Вкратце, как это делается в вордпресс:
1. Нам нужен путь до обработчика AJAX запросов wordpress
2. Нам нужно создать ключ безопасности nonce
3. Сам ajax запрос
4. и его php обработчик, в котором проверяем ключ nonce и функция висит на нужном хуке (залогиненный пользователь или гость)
Плагин WP-Recall позволяет избавиться от первых 2х пунктов. Прочь рутину!
Он уже определяет путь в объекте Rcl - Rcl.ajaxurl и содержит проверочный nonce в Rcl.nonce
Помимо этого в объекте Rcl есть:
Rcl.wpurl - главная страница вашего сайта
Rcl.rcl_url – путь до плагина wp-recall
Rcl.user_ID – текущий юзер – его id (если гость то 0)
И другое - подробней смотрите распечатав console.log(Rcl);
Выведем кнопку, по клику на которой сработает ajax.
В файле index.php:
// в футер вставим свою кнопку слева
function gas_block(){
$title = '<div>От улыбки хмурый день светлей,<br/>От улыбки в небе радуга проснется,<br/>'
.'Поделись улыбкою своей,<br/>И она к тебе не раз еще вернется!</div>'
.'<div>p.s. жми смайл - и подари улыбку</div>';
$out = '<div id="gas_smile" class="gas_open" onclick="gasPush(this);return false;">';
$out .= '<span>Подари улыбку</span>';
$out .= '<i class="fa fa-smile-o"></i>';
$out .= '</div>';
$out .= '<div id="gas_smile_motiv">'.$title.'</div>';
echo $out;
}
add_action('wp_footer', 'gas_block',100);
- простейшая функция, висит на хуке wp_footer - выведет кнопку в подвале. А потом мы css стилями ее, с фиксированной позицией, прижмем к левому верхнему краю. В стилях также укажем небольшую анимацию для плавного поведения.
В переменной $title у нас небольшой отрывок стихотворения, который появится при наведении на кнопку.
В блоке с id gas_smile - у нас на событие onclick - идет вызов js-функции gasPush - по клику запускаем ее.
Магия style.css:
#gas_smile {
background-color: #ffc03e;
border-left: 4px dotted #eb403b;
border-radius: 0 2px 2px 0;
font-size: 14px;
line-height: normal;
padding: 8px;
position: fixed;
top: 150px;
z-index: 2;
}
#gas_smile.gas_open {
align-items: center;
cursor: pointer;
display: flex;
left: -115px;
transition: left 0.3s ease-in-out;
}
#gas_smile.gas_open:hover {
background-color: #ffd04e;
left: 0;
transition: left 0.3s ease-in-out;
}
#gas_smile .rcl_preloader .fa {
left: auto;
right: 6px;
}
#gas_smile.gas_result:not(.gas_open) {
left: 0;
}
#gas_smile span {
color: #4b67ad;
padding: 0 8px 0 0;
}
#gas_smile > .fa {
color: #eb403b;
font-size: 24px;
}
#gas_smile_motiv {
background-color: #ffd2a6;
border-left: 5px solid #ff9e40;
border-radius: 0 2px 2px 0;
color: #000;
font-size: 14px;
left: -300px;
line-height: normal;
max-width: 300px;
opacity: 0;
padding: 5px;
position: fixed;
top: 195px;
transition: all 0.3s ease-in-out 0.15s;
z-index: 2;
}
#gas_smile:hover + #gas_smile_motiv {
left: 0;
opacity: 1;
transition: all 0.3s ease-in-out 0.15s;
}
#gas_smile_motiv > div:first-child {
margin-bottom: 8px;
}
.gas_count {
margin: 5px 0 0;
text-align: center;
}
.gas_nmbr {
color: #227fb0;
font-size: 30px;
font-weight: bold;
}
#gas_smile.gas_result:not(.gas_open)::after {
bottom: 3px;
color: #ffdd5b;
content: "\f118";
font-family: fontawesome;
font-size: 31px;
left: 3px;
position: absolute;
}
Кнопка создана. Стили для нее есть, теперь займемся ajax.
Файл scripts.js - в нем я подробно прокомментировал каждую строчку:
function gasPush(e){
if(jQuery(e).hasClass('gas_result')) return false; // если уже один раз отработало
jQuery(e).addClass('gas_result'); // ставим маркер что нажали один раз
rcl_preloader_show(jQuery('#gas_smile'),25); // покажем спиннер (иконка лоадера)
// формируем массив передаваемых данных
var gasData = {
action : "gas_callback", // коллбек для динамического хука
ajax_nonce : Rcl.nonce // проверочный ключ безопасности
};
// ajax post запрос
jQuery.post({
url: Rcl.ajaxurl, // путь до вордпресс обработчика ajax
dataType: "json", // тип данных с которыми работаем
data: gasData, // массив наших данных (сформировали выше)
success: function(data){ // при успешном возврате
if(data.gas_ok){ // gas_ok - ключ ответа что мы отправили в PHP функции
setTimeout(function(){ // у меня ajax слишком быстро работает - кручу спиннер еще 1000 миллисекунд
rcl_preloader_hide(); // скрываю спиннер
jQuery('#gas_smile_motiv').remove(); // удаляю блок со стишком
jQuery(e).removeClass('gas_open').empty().html(data.gas_ok); // очищаю кнопку и добавляю ответ что вернула PHP функция
},1000);
}
},
complete: function(){ // ajax-запрос завершился
setTimeout(function(){ // покажу результат на 8 секунд
jQuery(e).hide(400); // и скрою блок
},8000);
}
});
return false;
}
- тут одна функция, по клику она проверяет на 2 строке - что запущена один раз. На 4-й появляется recall loader - rcl_preloader_show - в нем указываем объект где выводить спиннер и размер.
В переменной gasData мы указываем уникальный экшен и nonce ключ безопасности (9 строка. Его формирует плагин WP-Recall)
Далее мы запускаем ajax-post запрос: 14 строка - указываем путь до вордпресс ajax обработчика. Этот путь плагин WP-Recall уже задает в объекте Rcl в Rcl.ajaxurl, тип данный и массив наших данных.
При получении успешного ответа от php функции - проверяем ключ data.gas_ok (18 строка) и если он пришел, то скрываем лоадер и выводим информацию со счетчиком.
По завершению ajax запроса мы на 8 секунд показываем блок и скрываем его. До следующей загрузки страницы.
Теперь рассмотрим php обработчик:
// ловим ajax
function gas_catch_smile(){
rcl_verify_ajax_nonce(); // проверка nonce
$smiles = get_option('give_a_smile') ? get_option('give_a_smile') : 0; // получаем значение
update_option('give_a_smile', ++$smiles); // увеличиваем на 1 и обновляем в БД
// формируем ответ
$gas_resp['gas_ok'] = '<div class="gas_ok">Спасибо за улыбку!</div>'
. '<div class="gas_count">Улыбок в базе: <div class="gas_nmbr">'.$smiles.'</div></div>';
echo json_encode($gas_resp); // отправляем в скрипт
wp_die();
}
if(defined('DOING_AJAX') && DOING_AJAX){
add_action('wp_ajax_nopriv_gas_callback', 'gas_catch_smile'); // No privileges - т.е. гость
add_action('wp_ajax_gas_callback', 'gas_catch_smile'); // любой залогиненный
}
- функция срабатывает на динамических ВП хуках wp_ajax_nopriv_gas_callback и wp_ajax_gas_callback (в scripts.js мы action : "gas_callback" задавали) - два хука нужны чтобы кнопка отрабатывала для гостей и залогиненных пользователей.
3 строка - функция rcl_verify_ajax_nonce - проверяем nonce ключ безопасности и ниже обычная php логика и wordpress api.
Пишем в таблицу wp_options в метаполе give_a_smile (7 строка).
Обратите внимание на 10-ю строчку: gas_ok - в js функции мы проверяем этот ключ ответа.
Закодировали в json на 13-й строке и отправили результат в скрипт. Скрипт вывел результат.
На этом ajax запрос завершен.
Подчищаем за собой – файл: delete.php:
Так как мы в базу данных - в таблицу wp_options, в метаполе give_a_smile пишем значения, то при удалении нашего дополнения нужно подчистить за собой. Это правило хорошего тона у разработчиков. Пользователю больше не нужно наше дополнение, а значит и данные от него хранить не нужно.
Плагин WP-Recall на странице "Дополнения" выводит ссылку "удалить" дополнение. При удалении через эту кнопку он ищет в корне дополнения файл delete.php и подключает его.
В нашем случае в этом файле разместим это:
delete_option('give_a_smile');
- wordpress функция для удаления ключа из таблицы wp_options
Наше дополнение готово. По FTP копируем папку give-a-smile на свой компьютер, архивируем в zip и теперь, поделившись им с другими людьми, они этот архив могут загружать через менеджер дополнений, в админке своего сайта, со страницы "Дополнения"

Комментариев (0)