VHAP — Administration plugin page template

запись от - 15 апреля 2026

Это плагин только для образца административной части. В нем есть только его настройки и больше ничего. Скачать можно здесь — https://github.com/vvhromov/vhap

Страница настройки плагина в WordPress делается довольно запутанно. Обычно получается большая простыня кода, в которой сходу разобраться трудно. Разбил код на 4 логических блока, чтобы было короче, проще и понятней.

0 — Шапка плагина

1 — Разовые действия при активации, деактивации, удалении плагина

2 — Настройка меню

3 — Сама страница настройки

4 — Необязательные дополнения

<?php
/*
Plugin Name:    VHAP
Plugin URI:     https://vahro.ru/blog/plugins/vhap-administration-plugin-template
Description:    VHAP - Administration plugin page template
Author:         vahro
Author URI:     https://vahro.ru/
Version:        1.0.0
*/

Чтобы WordPress понял что этот скрипт плагин, достаточно просто имени в комментарии

<?php
/*
Plugin Name:    VHAP
*/

Такой скрипт — уже плагин

Полей существенно больше (Header Requirements — https://developer.wordpress.org/plugins/plugin-basics/header-requirements/). Некоторые потом будут видны в списке плагинов на странице «Плагина» админки WordPress.

Разовые действия при активации, деактивации, удалении плагина

Цикл жизни плагина, после того как его установили — Активация, Деактивация, Удаление. Это полезно, когда нужно как-то подготовить плагин к работе и корректно удалить его.
— Активация — register_activation_hook()
можно использовать чтобы установить опции плагина по умолчанию add_option()
или создать собственную таблицу в базе данных.
— Деактивация — register_deactivation_hook()
очищаем какие-то временные данные
— Удаление register_uninstall_hook()
все почистить при удалении плагина.
В принципе, для небольшого, простого плагина ничего этого может быть и не нужно. WordPress все сделает сам.

// активация плагина
register_activation_hook( __FILE__, 
  function () {
    // что-то делаем при активации плагина в админке
    if( !get_option('vhap_toplevelmenu') ) {
      // если опции vhap_toplevelmenu не существует, она добавляется в БД (wp_options) со значением 'top' 
      add_option('vhap_toplevelmenu', 'top');
    }
    if( !get_option('vhap_deactivation') ) {
      // если опции vhap_deactivation не существует, она добавляется в БД (wp_options) со значением 'yes' 
      add_option('vhap_deactivation', 'yes');
    }
});

// деактивация плагина
register_deactivation_hook(  __FILE__, 
  function () {
  // что-то делаем при деактивации плагина в админке
});

// удаление плагина
// !!! анонимная функция в этом хуке не работает
register_uninstall_hook( __FILE__, 'vhap_uninstall');
function vhap_uninstall () {
  delete_option( 'vhap_toplevelmenu' );
  delete_option( 'vhap_deactivation' );
}

Страница настройки плагина вызывается из пункта меню.

Варианты такие:
1 — Поместить свой плагин подпунктом (submenu) в существующий пункт главного меню. Обычно используют пункт «Настройки» или «Инструменты».
2 — Добавить в главное меню админки свой собственный пункт. Такой вариант содержит больше возможностей — дополнительно можно завести несколько пунктов подменю, добавить свою иконку к плагину. В общем солидно. Ну конечно лучше если плагин при этом уровня «Contact Form 7» или «Yoast SEO».

1 - Добавляется подпункт меню админки
add_submenu_page( 
'options-general.php', 'VHAP', 'VHAP', 'manage_options', 'vhap', 
'vhap_options_html' );
или так
add_options_page( 
'VHAP', 'VHAP', 'manage_options', 'vhap', 'vhap_options_html' );
Варианты равноценные, add_options_page() просто обертка add_submenu_page() 
с параметром 'options-general.php' (пункт "Настройки")
Если нужно добавить подпункт в пункт "Инструменты" используется slug ‘tools.php’
add_submenu_page( 
'tools.php', 'VHAP', 'VHAP', 'manage_options', 'vhap', 
'vhap_options_html' );
или
add_management_page();

add_submenu_page — https://developer.wordpress.org/reference/functions/add_submenu_page/
add_options_page — https://developer.wordpress.org/reference/functions/add_options_page/
add_management_page — https://developer.wordpress.org/reference/functions/add_management_page/

2 - Добавляется пункт в главное меню админки (Top Level Menu)
  add_menu_page (
    'Плагин VHAP', // заголовок страницы - будем выводить его в <h1></h1>
    'VHAP', // текст ссылки в меню - будем выводить в основное меню админки WP слева
    'manage_options', // права пользователя, необходимые для доступа к странице - manage_options - administrator
    'vhap', // page id - https://site.ru/wp-admin/admin.php?page=vhap
    'vhap_options_html', // callback - функция, которая выводит содержимое страницы
    );
Добавляются подпункты к основному пункту меню
  // дублируется пункт из основного меню - одинаковый callback - vhap_options_html
  add_submenu_page ( 
    'vhap',
    'Плагин VHAP',
    'Настройка',
    'manage_options',
    'vhap',
    'vhap_options_html'
    );
  // дополнительный пункт меню - описание (документация) плагина - callback - vhap_doc_html
  add_submenu_page ( 
    'vhap',
    'Описание VHAP',
    'Описание',
    'manage_options',
    'vhap_doc',
    'vhap_doc_html'
    );
  // пункт submenu - ссылка на любой URL
  $permalink = 'https://vahro.ru';
  $submenu['vhap'][] = array( 'vahro', 'manage_options', $permalink );

Как бы не было организовано меню — add_submenu_page либо add_menu_page+add_submenu_page
вызов вешается на хук admin_menu

add_action( 'admin_menu', function() { 
  add_submenu_page ();
  либо 
  add_menu_page ();
  add_submenu_page ();
} );

Осталось вывести саму страницу настройки, которая вызывается при клике на пункт меню.
Это коллбэк (callback) — 5й параметр функции add_submenu_page и 6й add_submenu_page
Название может быть любым, здесь vhap_options_html
Эта функция отвечает за вывод html кода страницы настроек плагина, вывод принято оборачивать в div с классом wrap.

function vhap_options_html() {
  ?>
  <div class="wrap">
    Я страница настроек плагина
  </div>
  <?php
}

Сама страница настройки

На самом деле страница настроек посложней чем — <div class=’wrap’>Я страница настроек</div>
Довольно таки минималистичный вариант будет выглядеть как-то так

function vhap_options_html() {
  ?>
  <div class="wrap">
      <h1><?php echo esc_html( get_admin_page_title() ); // будет выведен заголовок страницы который определен в add_submenu_page ?></h1>
      <form method="post" action="options.php">
        <?php
          settings_fields( 'vhap_setting' ); // название настроек
          do_settings_sections( 'vhap_page' ); // slug (ярлык) страницы
          submit_button(); // функция для вывода кнопки submit
       ?>
      </form></div>
  <?php

Необязательные дополнения

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

Не совсем относится к странице настроек, но относится к административной части плагина добавление/удаление ссылок в общей таблице плагинов.
Можно, к примеру, удалить ссылку «Деактивация» и пользователь не сможет удалить плагин, и добавить какие-то свои ссылки, да хотя бы ссылку на ту же страницу настроек плагина прямо из списка.

Иконки пунктов меню — можно взять из библиотеки WordPress (Dashicons), но можно заменить на свою. SVG придется перекодировать в base64

Организация прокси для обхода CORS (Cross-Origin Resource Sharing) на фронтэнде. Если нужно из страницы настроек послать запрос на сторонний сервер. Например, проверить связь с API.

Уникальный защитный ключ nonce (Number Used ONCE) для определения прав пользователя wp_create_nonce(…)

Скачать плагин VHAP можно здесьhttps://github.com/vvhromov/vhap

Если нет времени и желания разбираться самостоятельно – обращайтесь