Создать плагин для WordPress

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

Оглавление
  1. Приступая к работе
  2. Активировать плагина
  3. Деактивировать плагин
  4. Пользовательские таблицы
  5. Скрипты и стили
  6. Создать шорткод
  7. Фильтр содержимого
  8. Работа с Ajax
  9. Написать SQL запрос
  10. Пользовательские поля
  11. Безопасность

Приступая к работе

Если нет каталога /wp-content/plugins создаём его. Внутри этого каталога, создаём файл с названием wp-demo-plugin.php, это будет основной файл для плагина.

для разделения слов используйте дефис (-)

Внутри основного добавим комменты:

<?php
/* Plugin Name: Demo Plugin
Plugin URI: https://htmlhook.ru
Description: Получать уведомления на email, когда ваш любимый автор публикует сообщение.
Version: 1.0
Author URI: https://htmlhook.ru
Author: Viktor Klim
License: GPL2
*/ ?>

В разделе плагины должно появится следующее.

Сделать плагин для WordPress
Плагин для WordPress
К началу

Активировать плагина

Функция для активации плагина WordPress.

function wp_demo_activation() 
{
...
}
register_activation_hook(__FILE__, 'wp_demo_activation');

Параметр __FILE__ путь к функции активации если она находится внутри основного файла плагина, второй параметр имя функции.

<?php
/* Plugin Name: Demo Plugin
Plugin URI: https://htmlhook.ru/sozdat-plugin-wordpress.html
Description: Получать уведомления на email, когда ваш любимый автор публикует сообщение.
Version: 1.0
Author URI: https://htmlhook.ru
Author: Viktor Klim
License: GPL2
*/
function wp_demo_activation() 
{
...
}
register_activation_hook(__FILE__, 'wp_demo_activation');

Теперь можно активировать плагин, посмотрите что будет…

К началу

Деактивировать плагин

Функция для деактивации плагина WordPress.

<?php
/* Plugin Name: Demo Plugin
Plugin URI: https://htmlhook.ru/sozdat-plugin-wordpress.html
Description: Получать уведомления на email, когда ваш любимый автор публикует сообщение.
Version: 1.0
Author URI: https://htmlhook.ru
Author: Viktor Klim
License: GPL2
*/
function wp_sample_activation() {
}
register_activation_hook(__FILE__, 'wp_demo_activation');
register_deactivation_hook( __FILE__, 'wp_demo_activation' );

Пользовательские таблицы

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

Создать свою таблицу:

global $wpdb;
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}sample_table");
$sql1 = "CREATE TABLE {$wpdb->prefix}sample_table ( id int(11) NOT NULL AUTO_INCREMENT,
activation_code varchar(255) NOT NULL,
email varchar(75) NOT NULL,
status int(11) NOT NULL, PRIMARY KEY (id) )
ENGINE=InnoDB AUTO_INCREMENT=1;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql1);

Основной файл плагина:

<?php
/* Plugin Name: Demo Plugin
Plugin URI: https://htmlhook.ru/sozdat-plugin-wordpress.html
Description: Получать уведомления на email, когда ваш любимый автор публикует сообщение.
Version: 1.0
Author URI: https://htmlhook.ru
Author: Viktor Klim
License: GPL2
*/
function wp_sample_activation() 
{
...
}
register_activation_hook(__FILE__, 'wp_demo_activation');
register_deactivation_hook( __FILE__, 'wp_demo_activation' );

global $wpdb;
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}demo_table");
$sql1 = "CREATE TABLE {$wpdb->prefix}demo_table ( id int(11) NOT NULL AUTO_INCREMENT,
activation_code varchar(255) NOT NULL,
email varchar(75) NOT NULL,
status int(11) NOT NULL, PRIMARY KEY (id) )
ENGINE=InnoDB AUTO_INCREMENT=1;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql1);

{$wpdb->prefix} префикс базы данных.

Даже если использовать функцию $wpdb->query для создания таблицы, рекомендуется использовать функции dbDelta, они сравнивают текущую структуру таблицы. Это не загружаются по умолчанию, поэтому вам нужно включить это в файл в первую очередь.

К началу

Скрипты и стили

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

add_action('wp_enqueue_scripts', 'demo_scripts');
function demo_scripts() {
  wp_enqueue_script('jquery');
  wp_register_style('demo_style', plugins_url('styles.css', __FILE__));
  wp_enqueue_style('demo_style');
  wp_register_script('jqueryUICore', plugins_url('ui/jquery.ui.core.js', __FILE__),array(“jQuery”));
  wp_enqueue_script('jqueryUICore');
 $config_array = array(“demo_name”=>“demo_value”);
wp_localize_script('jqueryUICore', 'demoData', $config_array);
}

Сначала нужно применить wp_register_style для регистрации файла стиля, а потом подключить сам файл wp_enqueue_style.

Наконец, вы можете добавить данные, которые будут использоваться для конкретных скриптов, используя функцию wp_localize_script убедитесь, что для администратора применяется admin_enqueue_script, а не wp_enqueue_script.

<?php
/* Plugin Name: Demo Plugin
Plugin URI: https://htmlhook.ru/sozdat-plugin-wordpress.html
Description: Получать уведомления на email, когда ваш любимый автор публикует сообщение.
Version: 1.0
Author URI: https://htmlhook.ru
Author: Viktor Klim
License: GPL2
*/
function wp_sample_activation() {
}
register_activation_hook(__FILE__, 'wp_demo_activation');
register_deactivation_hook( __FILE__, 'wp_demo_activation' );

global $wpdb;
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}demo_table");
$sql1 = "CREATE TABLE {$wpdb->prefix}demo_table ( id int(11) NOT NULL AUTO_INCREMENT,
activation_code varchar(255) NOT NULL,
email varchar(75) NOT NULL,
status int(11) NOT NULL, PRIMARY KEY (id) )
ENGINE=InnoDB AUTO_INCREMENT=1;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql1);

add_action('wp_enqueue_scripts', 'demo_scripts');
function demo_scripts() {
wp_enqueue_script('jquery');
wp_register_style('demo_style', plugins_url('styles.css', __FILE__));
wp_enqueue_style('demo_style');
wp_register_script('jqueryUICore', plugins_url('ui/jquery.ui.core.js', __FILE__),array(“jQuery”));
wp_enqueue_script('jqueryUICore');
$config_array = array(“demo_name”=>”demo_value”);
wp_localize_script('jqueryUICore', 'demoData', $config_array);
}
К началу

Создать шорткод

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

add_shortcode("shortcode_name", "shortcode_function");
  function shortcode_function() 
{
   return “<input type=’button’ value=’Share’ /> “;
}

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

shortcode используется на страницах, сообщениях или для плагинов.

Показать кнопку в содержании:

[shortcode_name]

Показать кнопку в шаблоне:

<?php echo do_shortcode ('[shortcode_name]'); ?>
К началу

Фильтр содержимого

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

Рассмотрим пример:

function demo_content_filter($content) 
{
  $banners = “HTML for banners”;
  $author = “HTML for author info”;
  return $banners.$content.$author;
}
add_filter( 'the_content', 'demo_content_filter' );

Можно использовать условные теги для фильтрации содержимого определенных страниц.

Только записей:

function demo_content_filter($content) 
{
  if(is_single())
  {
  return $banners.$content.$author;
  }
}
К началу

Работа с Ajax

Ajax в WordPress обеспечивает интерактивный контент (внешнее содержание) для пользователей.

$.post("admin-ajax.php", { action:"demo_ajax_action" },
function(result, textStatus) {
}, "json");

В приведенном выше запросе Ajax является действие. Оно будет использоваться в коде WordPress для идентификации запроса. Кроме того, все Ajax запросы должны быть направлены в файл admin-ajax.php.

function sample_ajax_action() 
{
echo json_encode($your_result_array); exit;
}
add_action('wp_ajax_nopriv_demo_ajax_action', 'demo_ajax_action');
add_action('wp_ajax_demo_ajax_action', 'demo_ajax_action');

Вы можете увидеть одинаковое название, используемые в Ajax wp_ajax_nopriv_ и wp_ajax_prefixes. wp_ajax_ используется для зарегистрированных пользователей, и wp_ajax_nopriv_ используется для пользователей, которые не вошли.

К началу

Написать SQL запрос

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

add_action('add_meta_boxes', 'add_custom_fields_box');
function add_custom_fields_box() 
{
add_meta_box('custom_fields_box_id', 'Custom Info', 'display_custom_info_box', 'post', 'normal', 'high');
}
function display_custom_info_box() 
{
global $post;
$html = "<table><tr><td>Установить</td><td><input id='custom_checkbox' type='checkbox' name='custom_checkbox' /></td></tr> <tr><td>Сделайте выбор</td><td><select name='custom_select'> <option>Список</option> </select></td></tr> <tr><td>Добавить файл</td><td><input id='custom_file' type='file' name='custom_file' /></td></tr></table>";
echo $html;
}
К началу

Пользовательские поля

WordPress предоставляет стандартный набор: title, content, image, и excerpt в окне создания контента. Нам нужны пользовательские поля, чтобы добавить дополнительные действия. Хотя мы можем использовать пользовательский раздел поля, он обеспечивает только текстовые поля. Нам нужно добавить отдельные поля, если нам нужно, флажки, радио-кнопки, раскрывающиеся меню и тому подобное.

add_action('add_meta_boxes', 'add_custom_fields_box');
function add_custom_fields_box() 
{
add_meta_box('custom_fields_box_id', 'Custom Info', 'display_custom_info_box', 'post', 'normal', 'high');
}
function display_custom_info_box() 
{
global $post;
$html = "<table><tr><td>Установить</td><td><input id='custom_checkbox' type='checkbox' name='custom_checkbox' /></td></tr> <tr><td>Сделайте выбор</td><td><select name='custom_select'> <option>Список</option> </select></td></tr> <tr><td>Добавить файл</td><td><input id='custom_file' type='file' name='custom_file' /></td></tr></table>";
echo $html;
}

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

К началу

Безопасность

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

wp_nonce_field('demo_frm_nonce', 'demo_frm_nonce');

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

if (!isset($_POST['demo_frm_nonce']) || !wp_verify_nonce($_POST['demo_frm_nonce'], 'demo_frm_nonce')){
return;
}

Если данное время не проверяется, запрос не обрабатывается.

WordPress Plugin API огромен, не просто запомнить все что с ним связано. Здесь написаны наиболее распространенных вещей, которые потребуется вам в процессе создания плагина.