WordPress. Создание плагина. Часть 1 из 2

22.05.2019

Теги: CMSWeb-разработкаWordPressПлагинУдалить

В первую очередь создаем отдельную поддиректорию внутри wp-content/plugins, в которой будут все файлы плагина. Имя главного файла плагина должно совпадать с названием директории плагина. После создания главного файла, в него нужно добавить комментарий, чтобы WordPress распознал новый плагин.

<?php
/*
Plugin Name: Hello, world!
Plugin URI: https://tokmakov.msk.ru
Description: Простой плагин, в целях изучения WordPress.
Version: 1.0
Author: Евгений Токмаков
Author URI: https://tokmakov.msk.ru
*/

После сохранения файла, плагин можно увидеть в панели управления:

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

Активация и деактивация плагина

В WordPress существуют три функции, которые позволяют зарегистрировать callback-функции, которые будут срабатывать в момент:

  • активации плагина — register_activation_hook()
  • деактивации плагина — register_deactivation_hook()
  • удаления плагина — register_uninstall_hook()
register_activation_hook(__FILE__, function() {
    // проверяем права пользователя
    if (!current_user_can('activate_plugins')) {
        return;
    }
    // проверям версию PHP, с которой плагин может работать
    if (version_compare(PHP_VERSION, '5.6.0', '<')) {
        die('Для работы плагина нужна версия PHP 5.6.0 или старше');
    }
    // записываем в лог информацию об активации плагина
    $date = date('d.m.Y H:i:s');
    $message = $date . ' Плагин «Hello, world!» активирован' . PHP_EOL;
    error_log(
        $message,
        3,
        dirname(__FILE__) . '/error.log.txt'
    );
});
register_deactivation_hook(__FILE__, function() {
    // проверяем права пользователя
    if (!current_user_can('deactivate_plugins')) {
        return;
    }
    // записываем в лог информацию о деактивации плагина
    $date = date('d.m.Y H:i:s');
    $message = $date . ' Плагин «Hello, world!» деактивирован' . PHP_EOL;
    error_log(
        $message,
        3,
        dirname(__FILE__) . '/error.log.txt'
    );
});

Здесь мы используем анонимные функции, которые выполняются в момент активации и деактивации плагина. Но можно использовать методы класса в качестве callback-функции:

$plugin = new TokmakovHelloPlugin();
// при активация плагина
register_activation_hook(__FILE__, [$plugin, 'activate']);
// при деактивация плагина
register_activation_hook(__FILE__, [$plugin, 'deactivate']);

class TokmakovHelloPlugin {

    public function activate() {
        // проверяем права пользователя
        if (!current_user_can('activate_plugins')) {
            return;
        }
        // проверям версию PHP, с которой плагин может работать
        if (version_compare(PHP_VERSION, '5.6.0', '<')) {
            die('Для работы плагина нужна версия PHP 5.6.0 или старше');
        }
        // записываем в лог информацию об активации плагина
        $date = date('d.m.Y H:i:s');
        $message = $date . ' Плагин «Hello, world!» активирован' . PHP_EOL;
        error_log(
            $message,
            3,
            dirname(__FILE__) . '/error.log.txt'
        );
    }

    public function deactivate() {
        // проверяем права пользователя
        if (!current_user_can('deactivate_plugins')) {
            return;
        }
        // записываем в лог информацию о деактивации плагина
        $date = date('d.m.Y H:i:s');
        $message = $date . ' Плагин «Hello, world!» деактивирован' . PHP_EOL;
        error_log(
            $message,
            3,
            dirname(__FILE__) . '/error.log.txt'
        );
    }
}

Удаление плагина

Функция register_uninstall_hook() регистрирует функцию, которая вызывается в момент удаления плагина, чтобы почистить все следы плагина в системе. Она должна вызываться из кода главного файла плагина, а не из функции или метода класса. В противном случае хук удаления может не сработать. А весь код удаления плагина должен находиться внутри функции или метода класса и подключаться через хуки.

register_uninstall_hook(__FILE__, function() {
    // проверяем права пользователя
    if (!current_user_can('delete_plugins')) {
        return;
    }
    // отправляем письмо администратору об удалении плагина
    wp_mail(
        get_bloginfo('admin_email'),
        'Плагин удален',
        'Плагин «Hello, world!» удален'
    );
});
register_uninstall_hook(__FILE__, ['TokmakovHelloPlugin', 'uninstall']);

class TokmakovHelloPlugin {

    public static function uninstall() {
        // проверяем права пользователя
        if (!current_user_can('delete_plugins')) {
            return;
        }
        // отправляем письмо администратору об удалении плагина
        wp_mail(
            get_bloginfo('admin_email'),
            'Плагин удален',
            'Плагин «Hello, world!» удален'
        );
    }
}

Для удаления плагина можно также использовать файл uninstall.php в корневой директории плагина:

<?php 
if (!defined('WP_UNINSTALL_PLUGIN')) {
    exit;
}
// проверка пройдена успешно — можно удалять опции, таблицы БД и т.д.
delete_option('some_option');

Для удаления плагина рекомендуется использовать именно файл uninstall.php, а не функцию register_uninstall_hook(). Если существует файл uninstall.php, то функция register_uninstall_hook() игнорируется и все управление по удалению плагина передается uninstall.php.

Поиск: CMS • Web-разработка • WordPress • Плагин • Удалить • Plugin • Активация • Деактивация

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.