Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Свой плагин

Плагин — код, который добавляет сайту возможности и не зависит от темы. Свой тип записей, форма, связь со сторонним сервисом должны продолжать работать после смены оформления, поэтому их пишут в плагине, а не в 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, включается всегда, и отключить его из панели нельзя. Так подключают код, без которого сайт не должен работать.

Частая ошибка

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

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.