Своя админка для темы в WordPress

В последнее время все чаще делаю сайты на WordPress. Делаю как для себя, так и для заказчиков.

Как мы все знаем, в шаблоне есть много вещей, которые прописаны именно в файлах шаблона, и изменить их можно только там, например: адрес RSS фида, какой-то текст в шапке или футере, урлы страниц которые прописаны именно в шаблоне, и многое другое.

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

Теперь расскажу как все эти параметры, которые в будущем возможно нужно будет изменить, вынести в отдельную админку:

Своя админка для темы в WordPress


Как подключить админку:

В файле header.php в самом верху прописываем:

<?php global $mytheme; ?>

В файле functions.php (после <?php ) прописываем:

/*********************************************************
Theme Control Panel
*********************************************************/
class ControlPanel {

/********************************************************
Array for Default Options
********************************************************/
var $default_settings = Array(
feed‘ => ‘ http://feeds.feedburner.com/raftkornnet’,
‘postright’ => ‘3′,
‘catn’ => ‘ 1,3′,
‘headtext’ => ‘Ну очень красивая шапка!’,
‘footertext’ => ‘Copyright © 2009 – Самый крутой сайт!’,
);

var $options;

/********************************************************
Initiate new control panel function
********************************************************/
function ControlPanel() {
add_action(’admin_menu’, array(&$this, ‘add_menu’));
if (!is_array(get_option(’themadmin’)))
add_option(’themadmin’, $this->default_settings);
$this->options = get_option(’themadmin’);
}

/********************************************************
Create a theme settings page to edit theme settings and put its css
********************************************************/
function add_menu() {
add_theme_page(’Theme Options’, ‘Theme Options’, 8, «themadmin», array(&$this, ‘optionsmenu’));
}

/********************************************************
The options page in control panel. Saving and editing goes here
********************************************************/
function optionsmenu() {
if ($_POST['ss_action'] == ’save’) {
$this->options["feed"] = $_POST['cp_feed'];
$this->options["postright"] = $_POST['cp_postright'];
$this->options["catright"] = $_POST['cp_catright'];
$this->options["headtext"] = $_POST['cp_headtext'];
$this->options["footertext"] = $_POST['cp_footertext'];
update_option(’themadmin’, $this->options);
echo ‘<div class=»updated fade» id=»message» style=»background-color: rgb(255, 251, 204); width: 400px; margin-left: 17px; margin-top: 17px;»><p>Your changes have been <strong>saved</strong>.</p></div>’;
}

echo ‘<form action=»" method=»post» class=»themeform»>’;
echo ‘<input type=»hidden» id=»ss_action» name=»ss_action» value=»save»>’;

print ‘
<div class=»cptab»><br>
<b>Theme Options</b>
<br>
<p><input class=»widefat» style=»width:300px» name=»cp_feed» id=»cp_feed» value=»‘.$this->options["feed"].’»> Адрес RSS фида</p>
<p><input class=»widefat» style=»width:100px» name=»cp_postright» id=»cp_postright» value=»‘.$this->options["postright"].’»> Количество постов в правой колонке</p>
<p><input class=»widefat» style=»width:100px» name=»cp_catright» id=»cp_catright» value=»‘.$this->options["catright"].’»> Рубрики для правой колонки (через запятую)</p>
<p>Текст в шапке:<br /><textarea style=»width:400px;height:75px;» name=»cp_headtext» id=»cp_headtext»>’.stripslashes($this->options["headtext"]).’</textarea></p>
<p>Текст в подвале:<br /><textarea style=»width:400px;height:75px;» name=»cp_footertext» id=»cp_footertext»>’.stripslashes($this->options["footertext"]).’</textarea></p>
</div>
‘;

echo ‘Все готово? Тогда <input type=»submit» value=»Сохранимся »» name=»cp_save» class=»dochanges» />’;
echo ‘</form>’;
}

/* ended cpanel class */
}

$cpanel = new ControlPanel();
$mytheme = get_option(’themadmin’);

Разберем немного поподробней этот код.

В блоке Array for Default Options задаются сами переменные и их начальное значение. К примеру произвольная переменная feed и ее изначальное значение http://feeds.feedburner.com/raftkornnet .

В блоке The options page in control panel мы подключаем переменные к админке, тут ничего сложного нет (строка $this->options["feed"] = $_POST['cp_feed']; ).

В Theme Options мы делаем вывод переменных в админку (<p><input class=»widefat» style=»width:300px» name=»cp_feed» id=»cp_feed» value=»‘.$this->options["feed"].’»> Адрес RSS фида</p>).

И так, для того чтобы подключить переменную feed нам нужно:
1) В блоке Array for Default Options указать эту переменную и ее значение (’feed’ => ‘ http://feeds.feedburner.com/raftkornnet’,).
2) Указать переменную в блоке The options page in control panel ($this->options["feed"] = $_POST['cp_feed'];)
3) Сделать вывод переменной в Theme Options (<p><input class=»widefat» style=»width:300px» name=»cp_feed» id=»cp_feed» value=»‘.$this->options["feed"].’»> Адрес RSS фида</p>) – тут сама переменная указывается в трех местах (name, id и value).

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

<?=$mytheme['имя_переменной']?>
Например: (<?=$mytheme['feed']?>)

Если перменная выводится внутри php функции, то это делается так:

‘.$mytheme['catn'].’
Например: query(’showposts=1&cat=’.$mytheme['catn'].»);

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

<?php get_footer(); ?> и <?php get_sidebar(); ?>

а вот так:

<?php include (TEMPLATEPATH . ‘/ footer.php’); ?> и <?php include (TEMPLATEPATH . ‘/sidebar.php’); ?>

Когда вы первый раз сохраните functions.php – все переменные которые там есть запишутся в БД, и сразу появятся в админке, но когда вы уже потом будете добавлять новые переменные в functions.php, они в админке будут идти с пустыми полями – это ничего страшного, когда заказчик активируется тему у себя первый раз – все переменные у него заполнятся правильно.

Желательно на каждом новом шаблоне делать уникальной переменную themadmin (themadmin1, themadmin2…) – это переменная самой админки, и под таким названием создается строка в БД (сама переменная в коде встречается 6 раз, т.е. заменить ее надо 6 раз).

Для чего это можно использовать? Да для чего угодно, например:

  • Выводить любой текст в шаблоне
  • Прописывать статический урлы (фиды, контакты…)
  • Задавать любые цифровые значения (количество популярных записей, количество символов в превью, уровень вложенности страниц…)
  • Использовать при верстке (цвет бекграунда, ширина сайтбара и текстового блока, адрес картинки для футера…)

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

_______________

Для того чтобы присвоить админке свои стили, после строки:

add_action(’admin_menu’, array(&$this, ‘add_menu’));

Добавляем :

add_action(’admin_head’, array(&$this, ‘admin_head’));

А после блока:

function add_menu() {
add_theme_page(’Theme Options’, ‘Theme Options’, 8, «themadmin», array(&$this, ‘optionsmenu’));
}

Добавляем :

function admin_head() {
print ‘<link rel=»stylesheet» href=»‘.get_template_directory_uri().’/cp.css» type=»text/css» media=»screen» />’;
}

Соответственно, cp.css в папке с темой будет подгружаться как стиль. Таким же образом можно добавить, например, скрипты.

_______________

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

  functions.rar (1.4 КБ, 136 скачиваний)

И functions.php со стилями:

  functions и css (1.7 КБ, 77 скачиваний)

1 звезда2 звезды3 звезды4 звезды5 звезд - оценить запись.
Загрузка ... Загрузка ...

Добавить запись в: google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
Комментарии (24)
04.23.09 16:27 // SladkijОтветить

после этих нововведений сайт не заглючит? Написано понятно, тока изменять стремно у себя(

04.26.09 22:37 // RaftKornОтветить

Sladkij, не заглючит :) . Вы возьмите на пробной теме попробуйте. Тем более, что вы только саму тему меняете.

05.10.09 09:50 // NolexОтветить

Пора уже подыматься на новый уровень в переходить с ВП скажем на джумлу)

05.10.09 11:46 // RaftKornОтветить

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

05.26.09 10:55 // SergeyОтветить

Здравствуйте, Виктор.
А можно поинтересоваться вашими успехами в области инвестирования в сайты. Есть ли у Вас опыт оценки того или иного продукта и ориентировочная стратегия раскрутки и получения дохода в будущем? Сорри, что не по теме статьи. Но если блог для новичков в бизнесе в интернете, хотелось бы услышать ваш опыт по данным наработкам.

10.06.09 12:57 // АлексейОтветить

А как можно прикрутить стандартный визуальный редактор допустим к полю «Текст в шапке»?

11.12.09 22:14 // HookОтветить

Спасибо!
Статья помогла сэкономить кучу времени и нервов :)

12.14.09 21:25 // ЮрийОтветить

у меня после нововведение вместо сайта выходит какая то ошибка
Parse error: syntax error, unexpected T_STRING, expecting ‘)’ in /home/temae207/domains/softfaq.ru/public_html/wp-content/themes/artemis/functions.php on line 11

12.14.09 23:04 // RaftKornОтветить

@Юрий: нужно посмотреть что у вас там в 11й строке, да и вообще functions.php полностью (можете мне через контактную форму его содержимое кинуть).

12.15.09 11:52 // ЮрийОтветить

отправил.

12.15.09 23:53 // RaftKornОтветить

@Юрий: проблема была в том, что при копировании из браузера не корректно записывались кавычки (редактор заменил), потому и выдавало ошибку. Отправил вам на почту, а также выложил здесь готовый вариант functions.php.

12.16.09 20:39 // ЮрийОтветить

спасибо теперь все работает

12.21.09 16:58 // инспектор ГаджетОтветить

сделал все как написано, появилась опция «wp theme options». только когда я на этой странице меняю что нибудь например «текст в шапке» или «текст в подвале» на самом сайте ничего не меняется

12.21.09 18:08 // RaftKornОтветить

@инспектор Гаджет: а Вы в шаблоне теги правильно вставили? После сохранения – в самой админке текст меняеться?

01.19.10 17:45 // JavelinesОтветить

А как быть с css?

01.20.10 09:34 // RaftKornОтветить

@Javelines: css тоже можно подключить, только я сейчас на отдыхе, числа 28 приеду, напишу как.

01.28.10 16:33 // RaftKornОтветить

@Javelines: Добавил в конце поста как подключить свои стили.

02.06.10 18:58 // КонстантинОтветить

@Nolex: Вот поднялись, снесли джумлу, поставили WP.

02.18.10 21:51 // KsanaОтветить

Спасибо за пример страницы настроек, пригодился.
Вот только не получается подключить к нему файл .css.
Т.е., я подключила так, как вы написали, но wordpress его в упор не видит и стили из этого файла не на странице не отображаются.

В чем может быть причина,помогите пожалуйста, разобраться.

02.18.10 22:58 // RaftKornОтветить

@Ksana: я на днях выложу пример файла с подгрузкой стилей.

02.18.10 23:29 // RaftKornОтветить

@Ksana: забыл дописать одну строку :) . В описании исправил и выложил архив с уже примененными стилями.

02.21.10 18:13 // KsanaОтветить

RaftKorn, спасибо.
Ваш пример меня просто спас – нужно было сделать нестандартный диз для страницы настроек (так клиент попросил), а стили не подключались.
Зато теперь все получилось отлично.
Спасибо!

04.15.10 16:02 // d0sОтветить

Здравствуйте, не однократно читал вашу статью, которая в своем роде спасла бы меня, если бы не пару нюансов..
Например в значениях по умолчанию – нельзя использовать переменные, это меня очень огорчило, хотя многим и не нужно это вообще, если речь идет о конкретном сайте, но при разработке шаблонов – это необходимо..((
Поискав по инету, найти вообще статей по данной теме практически невозможно, пришлось написать свою:
Опции Текущей Темы в WordPress, в данной статье используется другой способ, насколько я считаю более удачный. Хотя, кому как удобно.

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

04.15.10 17:05 // RaftKornОтветить

@d0s: не плохо. Скажем так – эта админка что я описал совсем простая, и используется чисто для вывода определенных данных. Вообще я сейчас использую совершенно другую, более продвинутую, с одной стороны более тяжелую, но с другой более удобную. Если будет время напишу о ней.

Оставить комментарий