Статьи

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

Долой старое; в с новым. Не так давно процесс создания страницы параметров для темы WordPress был чем-то вроде кошмара. Конечно, это было относительно легко сделать после того, как вы обернули голову вокруг процесса, но это потребовало огромного количества работы, включая написание проверок безопасности, создание форм, ручное добавление скрытых входных данных и так далее.

К счастью, начиная с WordPress 2.7, процесс был упрощен благодаря новому API настроек . Он также включил видео версию этого урока для тех, кто предпочитает более визуальный подход. Вы, несомненно, видели множество подобных статей в Интернете, но это сделает этот процесс максимально понятным, особенно для тех из вас, кто только начинает! Давайте начнем.

Прежде всего, давайте немного разберемся с нашими мыслями и определим, как именно мы хотим, чтобы наш конечный продукт выглядел и делал.

Эта страница параметров должна позволять нам загружать изображения, добавлять текст и, возможно, выбирать цветовые схемы. Рисунок 1, «Готовая страница опций» показывает, как мы хотим, чтобы наша страница опций выглядела к тому времени, когда мы закончим


Как только пользователь ввел значения в эту форму, мы можем извлечь их из файлов шаблона нашей темы, используя полезный метод get_option , например:

  <? php $ options = get_option ('plugin_options');  ?> <h2> <? php echo $ options ['banner_heading'];  ?> </ H2> 

В соответствии со значением, введенным на рисунке 1, «Готовая страница опций» , это отобразит «Buy Me». Довольно удобно, верно? Хорошо, давайте построим эту вещь.

У нас есть два варианта создания страницы параметров. Мы можем либо рассматривать его как плагин, и сохранять его в папке plugins , либо мы можем сделать его страницей опций для конкретной темы и сохранять ее в файле functions.php нашей темы (или другом файле, включенном в functions.php ). В этом случае мы пойдем с последним решением, хотя любой подход будет работать.

Поскольку functions.php будет хранить различные функции для вашей темы, лучше всего сохранить страницу параметров в своем собственном файле, который мы затем можем включить в файл functions.php . Начните с создания папки с именем functions в папке вашей темы. В этой папке создайте новый файл с именем admin-menu.php . Далее нам нужно сделать эту страницу видимой из нашего файла основных функций. Вернитесь к functions.php и включите этот файл следующим образом:


Так как TEMPLATEPATH автоматически сгенерирует путь к папке вашей темы, нам нужно только продолжить путь к admin-menu.php .

Затем мы должны сказать WordPress добавить новую страницу параметров в панель управления WordPress. Для удобства WordPress предоставляет полезную функцию add_options_page . Однако мы не можем немедленно вызвать этот метод — мы должны сначала зарегистрировать функцию с помощью admin_menu :


Приведенный выше код инструктирует WordPress вызывать функцию create_theme_options_page , которая добавляет страницу в раздел « Настройки » панели мониторинга WordPress. Для функции add_options_page требуется несколько параметров:

  • $page_title : заголовок страницы

  • $menu_title : название меню

  • $access_privileges : у кого есть разрешение на доступ к этой странице

  • $page_name : может быть уникальной строкой, но многие разработчики предпочитают использовать __FILE__ чтобы убедиться, что имя уникально и не может конфликтовать с другими страницами.

  • $callback : функция, которая будет обрабатывать создание формы параметров

Давайте разберемся с этим. По сути, мы говорим: «Добавьте новую страницу в раздел« Настройки »панели мониторинга, используйте эти значения для заголовка и привилегий доступа, а затем вызовите функцию build_options_page для управления созданием страницы».

Рисунок 2, «Ссылка на параметры темы в панели управления WordPress» показывает вывод ссылки в разделе « Настройки » меню панели управления WordPress.


Мы build_options_page функцию build_options_page ; теперь нам нужно его создать:



Это должно быть знакомо вам, за исключением, возможно, пары очков:

  • div с class icon32 используется для добавления этого маленького значка. WordPress имеет множество иконок, которые он использует для разных страниц; мы просто заимствуем этот для нашей пользовательской страницы.

  • По умолчанию кнопки панели управления WordPress имеют серый цвет. Применяя class button-primary , для которого WordPress уже написал стили, мы можем сделать кнопку синей и сделать ее «всплывающей» немного больше.

  • Мы используем esc_attr_e('Save Changes') в качестве значения для кнопки «Отправить». Мы используем функцию перевода, чтобы гарантировать возможность локализации этого текста.

Помните, когда это возможно, всегда используйте встроенные классы WordPress. Это делает ваши страницы более совместимыми с визуальными элементами панели инструментов.

Вы, должно быть, заметили, что, возможно, несколько странно, что мы не добавили никаких вкладов в нашу форму. Если бы мы использовали старый метод, мы бы сделали это; однако с API настроек этот процесс работает немного по-другому.

Нам нужно зарегистрировать наш новый параметр в базе данных, используя функцию register_setting . Но прежде чем мы сможем это сделать, мы должны снова прослушать хук admin_init . admin_init срабатывает при доступе к панели инструментов. Это тот момент, когда нам нужно зарегистрировать наши настройки параметров. В качестве второго параметра мы передадим имя функции обратного вызова, которая будет обрабатывать процесс регистрации наших настроек:

Пример 4. theme /functions/admin-menu.php (отрывок)

  add_action ('admin_init', 'register_and_build_fields'); функция register_and_build_fields () {register_setting ('plugin_options', 'plugin_options', 'validate_setting');} 


Эта функция register_setting принимает три параметра:

  • $option_group : строка, представляющая имя группы настроек

  • $option_name : имя опции

  • $sanitize_callback : функция обратного вызова, которая может обрабатывать любые конкретные операции или дезинфекцию

Регистрируя этот параметр plugin_options , мы можем в конечном итоге получить доступ к его сохраненным значениям, используя этот код:

  $ options = get_option ('plugin_options'); echo $ options ['value']; 

Поскольку мы указали validate_setting в качестве функции обратного вызова, мы должны определить его. Наша функция обратного вызова должна принять переменную $plugin_options и вернуть ее, когда она закончит проверку или дезинфекцию:


Мы будем делать больше с этой функцией в следующем примере.

Далее нам нужно использовать метод add_settings_section , который позволяет нам создавать разделы — группы похожих элементов — на нашей странице параметров. Разделы позволяют нам организовать отображаемую информацию, чтобы сделать ее более удобной для использования. Вы можете создать несколько разделов, если они нужны вашему проекту, но в большинстве случаев все будет хорошо. Итак, давайте добавим следующий код в нашу функцию register_and_build_fields :


Следующим шагом является добавление полей или входных данных для нашей страницы параметров с помощью функции add_settings_field . Давайте начнем с поля banner_heading . Следующий код можно снова добавить к функции register_and_build_fields :


В эту функцию мы можем передать всего шесть аргументов, хотя в этом приложении мы будем использовать только пять:

  • $id : уникальный идентификатор для атрибута

  • $title : заголовок поля; по сути это будет метка для ввода

  • $callback : обрабатывает создание ввода; из этой функции мы выведем необходимый HTML

  • $page : тип страницы настроек, к которой должен применяться этот раздел; опять же, в этом случае мы используем __FILE__ в качестве имени

  • $section : имя раздела, к которому относится это поле; мы назвали наш main_section

  • $args (необязательно): любые дополнительные аргументы, передаваемые в виде массива

С помощью этого кода мы добавили новое поле настроек и объявили banner_heading_section в качестве функции обратного вызова, которая будет обрабатывать создание ввода. Мы можем построить эту функцию сейчас:


Этот код требует небольшого пояснения. В простейшем виде функция выводит текстовое поле. Мы дали этому входу имя plugin_options[banner_heading] , чтобы позволить нам добавить новый ключ к настройке plugin_options которую мы зарегистрировали ранее. Наконец, эти входные данные не всегда будут пустыми. Чтобы напомнить администратору, какие значения в настоящее время установлены в каждой опции, мы используем атрибут значения текстового поля, чтобы отобразить текущее значение этой конкретной опции.

Мы успешно зарегистрировали нашу настройку plugin_options и добавили новое поле. Далее мы должны вернуться к нашей форме и указать, куда мы хотим вставить каждое поле или ввод. Вернитесь к функции build_options_page и измените форму следующим образом:


Обратите внимание, что мы добавили две новые функции:

  • settings_fields : эта чрезвычайно полезная функция выведет на экран все скрытые для нас поля, повысив безопасность нашего плагина. Прежде чем существовал API настроек, мы должны были сделать это вручную. Эта функция принимает один параметр: имя option_group , указанное в функции register_setting . Мы назвали наши plugin_options .

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

Если вы вернетесь к панели управления WordPress и нажмете на странице « Параметры темы» , вы увидите поле формы для заголовка баннера, как показано на рисунке 4, «Наш новый вариант заголовка баннера» .


Текстовое поле на изображении выше пустое, потому что мы еще не установили значение для параметра banner_heading . Как только мы введем значение, нажмите « Сохранить изменения» и обновите страницу, на нем будет отображено текущее значение параметра в базе данных.

Наша страница параметров отлично работает в ее нынешнем виде, но давайте сделаем ее немного стилизованной. Для этого мы можем использовать смесь собственных class WordPress, а также некоторые из наших собственных CSS. Чтобы сослаться на таблицу стилей со страницы параметров, мы должны прослушать хук admin_head — это действие будет выполнено, когда будет создан раздел admin_head для панели мониторинга. Здесь мы вставим нашу ссылку на таблицу стилей следующим образом:

Пример 11. theme /functions/admin-menu.php (отрывок)

  // Добавить stylesheetadd_action ('admin_head', 'admin_register_head'); функция admin_register_head () {$ url = get_bloginfo ('template_directory').  '/Functions/options_page.css';  echo "<link rel = 'stylesheet' href = '$ url' /> n";} 


admin_register_head — это функция обратного вызова, которая будет обрабатывать создание нашей таблицы стилей. Предполагая, что мы добавили новую options-page.css стилей options-page.css в папку functions , мы можем options-page.css тег ссылки, указывающий на этот файл.

Перед тем, как мы начнем редактировать нашу вновь созданную таблицу стилей, давайте добавим на нашу страницу несколько классов, для которых WordPress уже написал стиль. Вернитесь к функции build_options_page и добавьте class widefat в div theme-options-page :


Форма появится теперь, как показано на рисунке 6, «Дисплей после добавления класса widefat» .


Это немного помогает, добавляя некоторые границы; Однако, это все еще нуждается в работе. В новый файл options-page.css который мы только что создали, добавьте следующее:


С этим дополнительным CSS форма будет выглядеть, как показано на рисунке 7, «Форма параметров с нашим новым пользовательским CSS» .

Теперь, когда мы успешно создали рабочую форму параметров, мы можем уточнить ее и добавить больше полей. Давайте добавим новый раздел, который позволяет пользователю темы загружать логотип.

Первым шагом является добавление нового add_settings_field в созданную нами функцию register_and_build_fields :


Далее мы создаем logo_setting обратного вызова logo_setting которую мы указали выше. Это обрабатывает создание и отображение ввода:


Это должно сделать это (почти) — это добавит новое поле на страницу. Помните, что функция do_settings_sections циклически перебирает все поля настроек и отображает их на странице. Как видно на рисунке 8, «Поле загрузки файла для опции логотипа» , теперь отображается поле загрузки файла.


Хорошо, я солгал! Да, мы добавили ввод на страницу, но мы не написали логику, которая будет обрабатывать процесс загрузки и сохранения изображения, чтобы к нему можно было получить доступ.

Поскольку сейчас мы загружаем файлы из нашей формы, нам нужно добавить в enctype атрибут enctype :


Этот атрибут определяет способ кодирования данных формы.

Продолжая, нам нужно выполнить небольшую проверку, а затем загрузить изображение на сервер. Если вы вернетесь к определению register_setting , вы увидите, что он предлагает третий параметр, который может обрабатывать любые конкретные операции или санацию. Мы снова вызвали наш validate_setting :


Это идеальное место для того, чтобы пользователь загружал изображение (а не, например, файл .exe ), а затем загружал файл на сервер. Измените функцию validate_setting чтобы отразить следующий код:


Это будет самый запутанный раздел нашего кода. Когда файл загружен, он становится доступным через $_FILES переменную $_FILES . Этот массив будет содержать информацию об имени, типе, tmp_name , ошибке и размере файла. Однако в этом случае мы не можем предполагать, что одновременно загружается только один файл. На самом деле, ваша страница параметров может содержать несколько файловых входов. $_FILES мы должны использовать оператор foreach для фильтрации всех элементов в массиве $_FILES . Внутри оператора foreach каждого загруженного изображения будут представлены через массив $image .

Сначала мы определяем размер изображения больше 0, чтобы убедиться, что пользователь действительно загрузил файл.

Далее мы выполняем скромный уровень проверки, чтобы убедиться, что пользователь загрузил изображение, а не какой-то другой файл. По правде говоря, в любой другой ситуации такой подход не будет адекватным. Пользователь по-прежнему может изменить расширение файла, например, на .png , и успешно загрузить свой файл. Однако, поскольку эта страница уже ограничена только администраторами, эта проверка скорее предназначена для них. Если вам требуется более надежная защита для загрузки изображений, используйте функцию getimagesize PHP.

Эта функция preg_match определяет, включено ли регулярное выражение jpg|jpeg|png|gif в тип изображения. Если это так, мы можем предположить, что, скорее всего, пользователь загрузил изображение.

Затем мы вызываем wp_handle_upload WordPress wp_handle_upload , которая позаботится о перемещении и сохранении изображения в папку uploads вашей папки WordPress.

$file теперь будет равен массиву данных, содержащему информацию о загрузке, в частности, URL места, где он был сохранен (доступ с помощью $file['url'] ).

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

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

Благодаря этому, как и в случае с параметром banner_heading , мы можем получить доступ к нашему логотипу из наших файлов тем, написав этот код:

  <? php $ options = get_option ('plugin_options');  ?> <img src = "<? php echo $ options ['logo'];?>" alt = "Logo" />