Создание Пользовательских Страниц Параметров

29 июля 2020
  1. Создание страницы администратора
  2. Добавление полей
  3. Простой пример

Обратите внимание на скриншот - это то, что мы собираемся создать в этом уроке:


WordPress settings page with input field


1. Создайте страницу администратора

Первый шаг для нас-это решить, где именно в меню администратора мы собираемся создать страницу опций.

WordPress admin menu
Хорошая новость – вы можете создать его в любом месте, будь то в разделе настроек, в разделе панели мониторинга или в новом пользовательском разделе со значком.

Для этого есть в первую очередь две функции:

  • add_menu_page() – для создания новой страницы Меню верхнего уровня,
  • add_submenu_page() – для создания страницы подменю.

Чтобы упростить процесс, вместо add_submenu_page()этого вы можете использовать add_dashboard_page(), add_posts_page(), add_pages_page(), add_comments_page(), add_theme_page(), add_plugins_page(),add_users_page(), add_management_page()или add_options_page()в зависимости от того, где вы собираетесь добавить свою страницу подменю.

Ладно, давайте погрузимся в примеры.


Создание пользовательской страницы Меню верхнего уровня

Взгляните на этот код:

add_action( 'admin_menu', 'misha_menu_page' ); function misha_menu_page() {     add_menu_page(         'My Page Title', // страница <title>Название</title>         'My Page', // текст ссылки меню         'manage_options', // возможность получать доступ к странице         'misha-slug', // слаг-ссылка страницы         'misha_page_content', // функция обратного вызова /w контента         'dashicons-star-half', // иконка в меню         5 // приоритет     ); } function misha_page_content(){     echo 'What is up?'; }

Это очень просто, но если вы вставите его в свой functions.phpфайл, появится новая страница администратора.

Custom menu page in WordPress admin area

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


Создание настраиваемой страницы параметров

Создание нового пункта меню со значком-это круто, но правда в том, что когда вы создаете страницу настроек плагина, всегда лучше добавить ее в качестве страницы подменю в разделе Настройки.

Это лучшая практика, и в большинстве случаев я рекомендую вам делать это именно так.

add_action( 'admin_menu', 'misha_options_page' ); function misha_options_page() {     add_options_page(         'My Page Title', // страница <title>Название</title>         'My Page', // текст ссылки меню         'manage_options', // возможность получить доступ к странице         'misha-slug', // слаг-ссылка страницы         'misha_page_content', // функция обратного вызова с содержанием         2 // приоритет     ); } function misha_page_content(){     echo 'What is up?'; }

Очень похоже на предыдущий пример, не так ли? У нас больше нет только параметра значка.

How to create an options page in WordPress

Теперь вы уже знаете, как добавить любой пользовательский HTML-код на свои страницы опций, но в следующей главе я покажу вам, как правильно создавать там поля настроек.


2. Добавление полей с помощью API настроек

Прежде всего, давайте заполним нашу misha_page_content()функцию, которую мы создали на предыдущем шаге.

function misha_page_content(){     echo '<div class="wrap">     <h1>Моя страница Настроек</h1>     <form method="post" action="options.php">';         settings_fields( 'misha_settings' ); // имя группы настроек         do_settings_sections( 'misha-slug' ); // просто слаг страницы         submit_button();     echo '</form></div>'; }

Мы больше не будем вносить никаких изменений в эту функцию. Все, что вам нужно знать, это то, что мы используем две функцииsettings_fields()do_settings_sections(): печать всех полей настроек и заполнение их данными.

Если вы все делали правильно до этого момента, то у вас будет вот это:

WordPress options page without fields


2.1 Зарегистрируйте настройку и создайте поле

add_action( 'admin_init',  'misha_register_setting' ); function misha_register_setting(){     register_setting(         'misha_settings', // имя группы настроек        'homepage_text', // имя опции         'sanitize_text_field' // функция дезинфекции     );     add_settings_section(         'some_settings_section_id', // ID секции         '', // заголовок (если нужно)         '', // функция обратного вызова (если нужно)         'misha-slug' // слаг страницы     );     add_settings_field(         'homepage_text',         'Homepage text',         'misha_text_field_html', // функция, которая печатает поле         'misha-slug', // слаг страницы         'some_settings_section_id', // ID секции         array(             'label_for' => 'homepage_text',             'class' => 'misha-class', // для элемента <tr>         )     ); } function misha_text_field_html(){     $text = get_option( 'homepage_text' );     printf(         '<input type="text" id="homepage_text" name="homepage_text" value="%s" />',         esc_attr( $text )     ); }

Что такое esc_attr()функция и почему она здесь? В этом блоге есть отдельный учебник по экранированию выходных данных, где я сказал, что база данных не является надежным источником данных, и именно поэтому мы должны использовать экранирующие функции, прежде чем выводить что-либо в содержимое страницы.

А теперь у нас есть рабочая страница опций:

WordPress settings page with input field


2.2 Дезинфекция

Давайте на минуту вернемся к register_setting()функции из предыдущего фрагмента кода.

register_setting(     'misha_settings',     'homepage_text',     'sanitize_text_field' // функция дезинфекции );

Третий параметр-это имя функции, которая предназначена для дезинфекции (очистки) данных поля перед сохранением в базе данных. Напримерsanitize_text_field(), это функция WordPress по умолчанию, которая удаляет все символы, которые не разрешены к использованию в текстовом поле ввода. Если вы хотите передать целое число,вы можете использовать intval()absint()вместо него имена функций или. Или создайте пользовательскую функцию дезинфекции для своей цели.

Пример для положительных целых чисел:

register_setting( 'misha_settings', 'number_of_slides', 'absint' );


3. Простой пример

У нас есть некоторый код выше. На самом деле очень много кода. И все это для того, чтобы создать единое поле ввода.

Я хочу быть честным с вами – я никогда не делаю все это вручную на своих проектах. Потому что это отнимает много времени. Каковы же тогда решения? Я также не люблю Плагины, особенно ACF-подобные. Потому что мне лучше потратить еще пару часов и создать быстрый сайт, а не использовать медленные раздутые Плагины.

Просто сравните этот код со всем, что мы сделали выше:

add_filter( 'simple_register_option_pages', 'misha_option_page' ); function misha_option_page( $option_pages ) {     $option_pages[] = array(         'id'    => 'misha_slug',         'title' => 'My Page Settings',         'menu_name' => 'My page',         'fields' => array(             array(                 'id' => 'homepage_text',                 'label' => 'Homepage text',                 'type' => 'text',             ),         ),     );     return $option_pages; }

И мы имеем абсолютно тот же результат, что и при создании страницы опций с нуля в первой части учебника.

WordPress settings page with input field


Примечание автора

Миша пришел к решению – создать свой собственный плагин option pages с абсолютным минимумом функциональности. Это молниеносно, как и вы все кодируетеfunctions.php, но в то же время это экономит часы разработки.