Создание собственной темы для WordPress является отличным способом придать вашему блогу или иному сайту, основанному на WordPress, индивидуальный вид. Однако даже самая привлекательная и красивая тема не будет идеально подходящей, если вам приходится лезть «под капот» и редактировать ее PHP и HTML-код всякий раз, когда требуется несколько видоизменить ее аспекты. Особенно, если это приходится делать не вам, а вашему клиенту. К счастью, создание страницы настроек для вашей темы в WordPress является не таким уж сложным действием, и после прочтения данного руководства вы сможете создать собственную страницу настроек без какого-либо труда.
Шаг 1. Выясняем, какие настройки нам необходимы.
Все начинается с потребностей: чтобы создать четкую и полезную страницу настроек, вы должны определить то, что требуется изменить, оставив все остальное неизменным. Каждый новый параметр, который вы добавляете к администраторскому меню, увеличивает сложность пользовательского интерфейса – вы рискуете сделать тему трудной в использовании. Вот почему лучше быть осторожным и тщательно подбирать такие опции, которые будут часто изменяться, отбросив настройки, изменяемые однократно, что может быть легко сделано путем корректировки соответствующих файлов темы.
Еще один вопрос, который нужно иметь в виду: «Кто будет изменять данные настройки?» Если пользователь знаком с WordPress и PHP, то разумно было бы ожидать, что он сможет самостоятельно внедрить код Google Analytics в тему, но вы не должны требовать этого от графического дизайнера, не говоря уже об авторах, которым не нужно знать ни HTML, ни CSS.
Общие идеи для компонентов, которые нужно вынести в настройки темы, включают в себя:
- Код отслеживания Google Analytics
- Число сайдбаров и их расположение (слева, справа, может даже вверху и внизу)
- Ширина страниц
- Контент в футере
- Опции для возможностей, которые являются специфичными для темы, такие как, к примеру, форматы тизеров.
Как только вы собрали список возможностей темы, которыми вы хотели бы управлять посредством страницы настроек, вы практически готовы начать их реализацию. Прежде чем пойти дальше и создать свою страницу настроек, вы можете сохранить свое время, убедившись в том, что в WordPress уже нет такой функции, доступной для изменения. Виджеты, произвольные меню, произвольные бэкграунды и изображения для хэдера – все это полезные инструменты для того, чтобы сделать вашу тему настраиваемой, при этом гораздо меньшими усилиями, которые обычно требуются ля создания ваших собственных настроек. Правда, все эти компоненты – тема для другого руководства.
Настройки, создаваемые в
данном руководствеДля данного учебного руководства я взял главную страницу, состоящую из сетки с различным количеством популярных записей, которые могут быть выбраны, отредактированы и переупорядочены администратором с помощью произвольной страницы настроек.
В редакторе элементы главной страницы будут представляться в виде списка, к которому можно добавлять новые пункты с помощью Javascript и Jquery.
Мне нравится иметь предварительный просмотр страницы администратора в консоли WordPress, когда я пишу HTML, поэтому я обычно начинаю с того, что привязываю страницу настроек к WordPress, и затем только перехожу к разработке контента страницы. Именно поэтому нашим следующим шагом будет создание пустой страницы настроек и подцепление ее к WordPress.
Шаг 2. Подцепление страницы настроек к WordPress.
Создание страницы настроек начинается с написания функции, которая устанавливает меню и подцепляет его к действию admin_menu. Это говорит WordPress о том, что нужно вызвать функцию при создании меню, чтобы все было завершено в соответствующее время. Добавьте следующий код к файлу functions.php вашей темы:
Function setup_theme_admin_menus() {
// Мы напишем контент функции очень скоро.
}
// Она говорит WP, что нужно вызвать функцию "setup_theme_admin_menus"
// когда нужно будет создать страницы меню.
add_action("admin_menu", "setup_theme_admin_menus");
Теперь мы поместим код для создания страницы настроек в функцию, которую мы только что написали:
При создании страницы настроек у вас есть выбор – либо добавлять страницу в виде подменю к одной из существующих групп настроек, либо создавать свое собственное меню верхнего уровня.
Добавление подменю производится с помощью функции add_submenu_page:
- $parent_slug – уникальный идентификатор для меню верхнего уровня, к которому будет добавлено подменю.
- $page_title заголовок добавляемой страницы.
- $menu_title заголовок, отображаемый в меню (зачастую короткая версия $page_title)
- $capability – минимальные права доступа, требуемые пользователю, чтобы получить доступ к данному меню.
- $menu_slug – уникальный идентификатор для создаваемого меню.
- $function – название функции, которая вызывается для обработки (и представления) данной страницы меню.
Если вы хотите добавить страницу меню в качестве подменю к уже существующей группе WordPress, вы можете использовать следующие значения в качестве параметра $parent_slug:
- Dashboard: index.php
- Posts: edit.php
- Media: upload.php
- Links: link-manager.php
- Pages: edit.php?post_type=page
- Comments: edit-comments.php
- Appearance: themes.php
- Plugins: plugins.php
- Users: users.php
- Tools: tools.php
- Settings: options-general.php
Группа Appearance является хорошим кандидатом для размещения нашей страницы настроек. Давайте остановимся на ней, и попробуем создать нашу первую страницу настроек. Вот обновленная версия нашей функции установки меню:
Function setup_theme_admin_menus() {
add_submenu_page("themes.php",
"Front Page Elements", "Front Page", "manage_options",
"front-page-elements", "theme_front_page_settings");
}
Нам по-прежнему надо создать функцию theme_front_page_settings для работы с настройками. Вот самая простая ее форма:
Function theme_front_page_settings() {
echo "Hello, world!";
}
Вот как это будет выглядеть в действии:
Нам также нужно проверить, имеет ли пользователь права, требуемые для редактирования страницы настроек. Чтобы сделать это, добавим следующий код в самом начале функции страницы настроек:
// проверяем, что пользователь может обновлять настройки
if (!current_user_can("manage_options")) {
wp_die("You do not have sufficient permissions to access this page.");
}
Теперь, если пользователь, которому нельзя управлять страницей настроек, зайдет на страницу настроек, он увидит обычное сообщение: «У вас нет достаточных прав, чтобы получить доступ к данной странице».
Если для вашей темы требуются многочисленные страницы настроек, это может запутать пользователя, поскольку ему придется разыскивать их в меню. В таком случае создание вашей собственной группы настроек значительно упростит поиск страниц в меню.
Чтобы добавить свою собственную группу настроек, вы должны создать страницу меню верхнего уровня, и соединить с ней страницы подменю. Вот новая версия нашей функции для создания меню. Функция add_menu_page создает меню верхнего уровня по аналогии с add_submenu_page, за исключением лишь того, что ей не нужен параметр $parent_slug.
Function setup_theme_admin_menus() {
add_menu_page("Theme settings", "Example theme", "manage_options",
"tut_theme_settings", "theme_settings_page");
add_submenu_page("tut_theme_settings",
"Front Page Elements", "Front Page", "manage_options",
"front-page-elements", "theme_front_page_settings");
}
// нам нужно добавить функцию обработки меню верхнего уровня
function theme_settings_page() {
echo "Settings page";
}
Если вы протестируете код и обновите консоль WordPress, то вы увидите новую группу меню, представленную в самом низу списка меню.
Однако пока это выглядит не совсем верно. Щелчок по верхнему элементу меню приводит вас не к странице меню Front Page, а к странице Example theme. Это не совпадает с тем, как работают остальные меню WordPress, потому давайте сделаем еще одну вещь: изменив атрибут $menu_slug в вызове add_submenu_page на то же самое значение, что и в меню верхнего уровня, мы можем связать два меню так, чтобы выбор верхнего пункта приводил к появлению меню Front Page.
Function setup_theme_admin_menus() {
add_menu_page("Theme settings", "Example theme", "manage_options",
"tut_theme_settings", "theme_settings_page");
add_submenu_page("tut_theme_settings",
"Front Page Elements", "Front Page", "manage_options",
"tut_theme_settings", "theme_front_page_settings");
}
function theme_settings_page() {
}
Выглядит уже лучше. Если вы все еще хотите улучшить представление своей группы меню, вы можете воспользоваться двумя дополнительными полями в функции add_menu_page. Просто добавьте значения после названия функции в вызове метода:
- $icon_url – определяет URL иконки для меню верхнего уровня.
- $position – определяет позицию вашей группы меню в списке меню. Чем больше значение, тем ниже позиция в меню.
Шаг 3. Создаем HTML-форму для страниц настроек.
Теперь, когда мы создали страницу настроек, и она отобразилась в боковом меню, пора начать добавлять к ней некоторый контент. Давайте вернемся к списку настроек и спроектируем страницу для редактирования их.
В данном руководстве нам нужно поле для определения, сколько элементов должно быть выведено в одной строке, и список для определения существующих элементов. Начнем с более простого: давайте создадим текстовое поле для количества элементов в одной строке. Отредактируем функцию для страницы настроек:
Function theme_front_page_settings() {
?>
Front page elements
Featured post:
Front page elements
Featured posts
Add featured post
Featured post:
Settings saved
. Этим мы покажем серверу, что работаем с PHP.
Создаем секциюТеперь нам нужно добавить свои настройки. Делается это в 2 захода. Напрягли мозги. Напряжемся раз: добавляем секцию настроек.
В созданный нами ранее файл functions.php добавим такой код:
Add_action("customize_register", function($customizer){
$customizer->add_section("example_section_one",
array("title" => "Мои настройки",
"description" => "Пример секции",
"priority" => 11,));
});
Мы создали хук и привязали к нему функцию. Метод add_section() как раз и добавляет секцию настроек. Он принимает 2 параметра:
$args — массив аргументов
title — как секция будет называться
description — описание секции (необязательно)
Добавляем настройку в секциюДобавление происходит в 2 этапа. Сначала создаем сами настройки, а затем контрол для нее, чтобы отобразить в секции.
Для добавления настроек
напишем такой код в functions.php прямо после метода add_section(), но в внутри хука customize_register:
$customizer->add_setting("example_textbox",
array("default" => "Сайт сайт"));
Метод add_setting() принимает два параметра:
$id — уникальный идентификатор
$args — массив аргументов
В массиве $args может быть несколько позиций, а именно:
default — значение настройки по-умолчанию
type — тип настройки
capability — права пользователя, необходимые для изменения данного параметра. Т.е. разные параметры могут видеть разные группы пользователей. Круто! (необязательно)
theme_supports — указывает на то, что текущая тема должна поддерживать описанную в параметре функцию (необязательно)
transport — как изменение настройки будет отображаться в окне предпросмотра. Обновление страницы или AJAX. По умолчанию страница обновляется при каждом обновлении настройки, но если вам интересно могу рассказать, как реализовать это на AJAX, без перезагрузки страницы. Пишите в комментах свои пожелания.
sanitize_callback — имя функции для фильтрации входных данных, в БД
sanitize_js_callback — имя функции для фильтрации выходных данных, из БД
Теперь добавим контрол к настройкам
. Ниже добавим такой код:
$customizer->add_control("example_textbox",
array("label" => "Настройка текста",
"section" => "example_section_one",
"type" => "text",));
Вот теперь мы можем увидеть нашу настройку.
// картинку
Метод add_control() принимает два параметра:
$id — уникальный идентификатор
$args — массив аргументов
В массиве $args может быть несколько позиций, а именно:
label — название настройки
description — описание
section — секцию, в которую будет помещен контрол и настройка
type — тип контрола (по-умолчанию: text)
choices — для типа с переключателями флажками, определяет список значений на выбор
priority — какой по счету будет располагаться секция или ее приоритет (по-умолчанию 10)
Но мы не вывели настройку в теме. Давайте займемся этим.
Выводим настройки в темеДля того, чтобы отобразить настройки в теме надо добавить его идентификатор в нужном месте. Сделать это легко, достаточно добавить конструкцию:
Функция get_theme_mod() принимает два аргумента^
$name — имя настройки, которую нужно получить
$default — значение по-умолчанию. Выведется, если настройки не существует
Другие типы контроловCheackBox (Флажок)
Позволяет включить или отключить, что либо.
$customizer->add_control("hide_text",
array("type" => "checkbox",
"label" => "Скрыть текст",
"section" => "example_section_one",));
В теме выводится так:
Теперь, если вы не выбрали флажок, то этот текст не выведется. Полезно, если нужно скрыть. что нибудь.
Radio (Группа переключателей)
Позволяет выбрать, какой либо 1 параметр из списка.
$customizer->add_setting("radio
",
array("default" => "item_1"));
$customizer->add_control("radio
",
array("type" => "radio",
"label" => "Пример переключателей",
"section" => "example_section_one",
"choices" => array("item_1" => "item_1",
"item_2" => "item_2",
"item_3" => "item_3",),));
Select (Список)
Выпадающий список.
$customizer->add_setting("select",
array("default" => "Вордпресса"));
$customizer->add_control("select",
array("type" => "select",
"label" => "Кто мы?",
"section" => "example_section_one",
"choices" => array("Человеки" => "Человеки",
"Стахановцы" => "Стахановцы",
"Крутые ребята" => "Крутые ребята",
"НЛО" => "НЛО",),));
Выпадающий список страниц
Создает выпадающий список всех страниц сайта. Страницы генерируются самим WordPress.
$customizer->add_setting("page-setting",
array("sanitize_callback" => "example_sanitize_integer"));
$customizer->add_control("page-setting",
array("type" => "dropdown-pages",
"label" => "Выберите страницу:",
"section" => "example_section_one",));
Палитра
Позволяет добавить палитру выбора цветов. К примеру, для заднего фона.
$customizer->add_setting("color-setting",
array("default" => "#000000",
"sanitize_callback" => "sanitize_hex_color",));
$customizer->add_control(new WP_Customize_Color_Control($customizer,
"color-setting",
array("label" => "Настройка цвета",
"section" => "example_section_one",
"settings" => "color-setting",)));
Позволяет загружать файлы через стандартный загрузчик WP. Работает через класс WP_Customize_Upload_Control. Будьте внимательны.
$customizer->add_setting("file-upload");
$customizer->add_control(new WP_Customize_Upload_Control($customizer,
"file-upload",
array("label" => "Загрузка файла",
"section" => "example_section_one",
"settings" => "file-upload")));
Тоже самое, что загрузка файлов, только ставятся ограничения на разрешения файлов. Принмаются только картинки. Удобно. если надо грузить только изображения. К примеру, для заднего фона. Работает по той же схеме, что пример выше, только используется класс WP_Customize_Image_Control.
$wp_customize->add_setting("img-upload");
$wp_customize->add_control(new WP_Customize_Image_Control($wp_customize,
"img-upload",
array("label" => "Загрузка изображения",
"section" => "example_section_one",
"settings" => "img-upload")));
Это еще не всеЕсли вы думаете, что на этом возможности встроенных настроек ограничиваются, то вы ошибаетесь. В них много чего интересного: добавление собственных настроек, обновление страницы через AJAX. Можете покопаться сами или пишите в комментариях, если хотите продолжения.
Плюсы и минусыА теперь подведем итоги и рассмотрим подводные камни и преимущества данного метода.
Плюсы:- Настройки встроены в ядро WordPress. Это значит, что при переносе сайта или его обновлении на новую версию у нас сразу будут настройки без скачки обновлений фрейморков и несовместимости
- Очень легко добавить. Достаточно базовых знаний по WP и PHP, чтобы добавить настройки в тему. Гораздо проще, чем подключать сторонние решения
- Добавление своих типов настроек. Можно расширить функционал. Есть такая возможность, что очень радует.
- Изменения появляются сразу в окне предпросмотра.
Минусы:- Нет поддержки визуального редактора для текста. Это серьезный минус для сложных проектов.
- Недостаточно типов настроек. Очень много чего нет, а хотелось бы. К примеру, тот же слайдер с неограниченным количеством слайдов. Отчасти решается возможностью добавить свой контрол. Но это лишние телодвижения.
- Нет импорта/экспорта. Если вы захотите переустановить тему. то все настройки придется заново вбивать вручную! Что крайне неудобно.
- Вы ограничены в свободе размещения блоков. За простоту надо платить. Вы не можете разместить блок с предупреждением или информацией где вздумается, все в рамках заданного формата. Для кого-то неважно, для других критично. Каждый реашет сам.
ЗаключениеЧто касается моего мнения, то я считаю, что Theme Customizer пока сыроват. Да. у него большой потенциал и я уверен в будущем мы увидим много расширений и улучшений для него. Но сейчас разрабатывать сложные проекты на нем не получится.
Если вы делаете простенькую тему или тренируетесь, то обратите внимание на эту «фишку» WP. Если же вы уже серьезно работаете с каким либо и думаете, стоит, переходит или нет, то лучше не стоит. Пока, не стоит. Но определенно стоит посмотреть, что это за «зверь». Ведь потенциал у него большой.
Но, как говорится, каждый решает сам по своему опыту и сложности проектов. На этом я с вами прощаюсь до следующей статьи. Всего вам доброго. И да прибудет с вами терпение в нелегком изучении WordPress.
Только следует учесть, что вордпресс генерирует некоторые классы, которые должны присутствовать в таблице стилей. К примеру классы aligncenter, alignleft и alignright
служат для выравнивания изображений и блочных элементов, и их нужно включить в свою таблицу стилей (можно скопировать из таблицы стилей дефолтной темы):
.aligncenter,
div.aligncenter {
display: block;
margin-left: auto;
margin-right: auto;
}
.alignleft {
float: left;
}
.alignright {
float: right;
}
Следующие классы используются для выравнивания изображений, которые имеют подписи (можно скопировать из дефолтной темы, в дальнейшем при необходимости поправить):
.wp-caption {
border: 1px solid #ddd;
text-align: center;
background-color: #f3f3f3;
padding-top: 4px;
margin: 10px;
/* необязательные параметры, которые сделают скругленные углы в поддерживаемых браузерах*/
-moz-border-radius: 3px;
-khtml-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
.wp-caption img {
margin: 0;
padding: 0;
border: 0 none;
}
.wp-caption p.wp-caption-text {
font-size: 11px;
line-height: 17px;
padding: 0 4px 5px;
margin: 0;
}
Кроме того, существует еще несколько классов WordPress, которые необязательно описывать в таблице стилей, но, т.к. WordPress генерирует страницы с их использованием, можно и им задать стиль:
.categories {...}
.cat-item /* Этот класс присваивается всем категориям */}
.current-cat {/* стиль текущей категории */}
.current-cat-parent {/* стиль для предка(ов) текущей категории */}
.children {/* класс для потомка */}
.pagenav {/* постраничная навигация */}
.page_item {/* любой элемент списка */}
.current_page_item {/* этот класс присваивается в списке страниц к текущей активной странице */}
.current_page_parent {/*класс для родительской страницы по отношению к текущей */}
.current_page_ancestor {/* любая страница верхних уровней по отношению к данной */}
.widget {/* все виджеты обворачиваются в этот класс */}
В процессе верстки используйте блоки и стили к ним, как это определено в скринах в начале статьи. Это не обязательно, но очень даже желательно.
К примеру в дальнейшем мы подключим поисковую форму на сайт через спец. тег wordpress
, в результате чего wordpress выведет такую форму:
Найти:
Поэтому учитываем это при верстки темы.
И последнее, что нужно добавить в style.css это информацию о себе любимом и о созданной теме. Информация размещается в начале файла в коментах:
/*
Theme Name: Придумайте уникальное имя темы
Theme URI: http://ссылка-на-домашнюю-страницу-темы
Description: Описание темы
Author: Автор темы
Author URI: http://ссылка-на-страницу-автора
Template: название-темы-предка
Tags: теги темы - только из списка предлагаемого wordpress.org
Version: версия
Ну и здесь текст лицензии
*/
Также не забудьте сделать screenshot.png
и положить его в папку с шаблоном (в корень). Информация, размещенная таким образом в таблице стилей, будет отображаться в админке в разделе Управление «темами»
. Сверстанный шаблон тестируем в браузерах, если все норм, можно идти далее.
Код страниц сверстанного шаблона приводить не буду, т.к. он достаточно большой, вы его просто скачайте , далее будем работать с ним.
Принцип работы wp-темы
:
Если вы откроете папку темы по умолчанию (wp-content/themes/default), вы увидите множество файлов PHP (файлы темы) и одного файла style.css. Когда мы просматриваем блог, WP подключает файлы темы (index.php
Теперь идем в папку с дефолтной темой, открываем header.php
и копируем оттуда теги , , , and
и ими заменям соответствующие строки в нашем header.php
.
Затем все теги
, находящиеся id="nav"
(список страниц в верхней части блога) заменям на функцию вордпресса
В итоге получаем: