Свой плагин
Плагин — код, который добавляет сайту возможности и не зависит от темы. Свой тип записей, форма, связь со сторонним сервисом должны продолжать работать после смены оформления, поэтому их пишут в плагине, а не в functions.php.
Файл плагина
Создайте папку wp-content/plugins/reading-time и в ней файл с тем же именем:
<?php
/**
* Plugin Name: Reading Time
* Description: Показывает примерное время чтения записи.
* Version: 1.0.0
* Author: Анна Иванова
* Text Domain: reading-time
*/
// reading-time.php
defined('ABSPATH') || exit;
add_filter('the_content', function (string $content): string {
if (!is_singular('post')) {
return $content;
}
$minutes = max(1, (int) ceil(str_word_count(wp_strip_all_tags($content)) / 200));
return '<p class="reading-time">Время чтения: ' . $minutes . ' мин</p>' . $content;
});Плагин появится в разделе «Плагины». Включите его — перед текстом каждой записи появится время чтения.
Защита от прямого вызова
Строка defined('ABSPATH') || exit; останавливает файл, если его открыли напрямую по адресу, а не через WordPress. Её ставят в начало каждого файла плагина.
Активация и деактивация
// reading-time.php
register_activation_hook(__FILE__, function () {
add_option('reading_time_speed', 200);
});
register_deactivation_hook(__FILE__, function () {
// остановить задачи по расписанию
});Активация выполняется один раз при включении плагина — здесь создают таблицы и значения настроек по умолчанию.
Удаление
Когда плагин удаляют из панели, WordPress выполняет файл uninstall.php. В нём убирают за собой:
<?php
// uninstall.php
defined('WP_UNINSTALL_PLUGIN') || exit;
delete_option('reading_time_speed');Пути и адреса
// reading-time.php
require_once plugin_dir_path(__FILE__) . 'includes/settings.php';
add_action('wp_enqueue_scripts', function () {
wp_enqueue_style('reading-time', plugins_url('assets/style.css', __FILE__), [], '1.0.0');
});plugin_dir_path() возвращает путь к папке на диске, plugins_url() — адрес файла для браузера.
Уникальные имена
Все плагины и тема работают в одном пространстве имён PHP. Функция с именем get_settings() почти наверняка столкнётся с чужой. Есть два способа этого избежать — приставка или пространство имён:
// reading-time.php
namespace ReadingTime;
function minutes(string $content): int
{
return max(1, (int) ceil(str_word_count(wp_strip_all_tags($content)) / 200));
}
add_filter('the_content', __NAMESPACE__ . '\\prepend');
function prepend(string $content): string
{
return '<p>' . minutes($content) . ' мин</p>' . $content;
}Приставку добавляют и к названиям настроек, хуков и таблиц: reading_time_speed, а не speed.
Обязательные плагины
Файл, положенный в папку wp-content/mu-plugins, включается всегда, и отключить его из панели нельзя. Так подключают код, без которого сайт не должен работать.
Частая ошибка
Код активации срабатывает только при включении плагина. Если вы добавили в него создание таблицы уже после того, как плагин включён, таблица не появится. При разработке отключите плагин и включите снова, а для сайтов с установленным плагином заведите проверку версии в настройках и обновляйте структуру при её изменении.