Своя админка для темы в 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:

[download id="1"]

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

[download id="3"]

1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка ... Загрузка ...

Комментарии (16)
06.04.08 22:04 // SanchezBoyОтветить

Отличный пост. От себя могу добавить, чтобы выводилось на каждой странице по 5 постов, а не по 10, как это в настройках WP. Таким образом, если вы используете PageNav, то это ещё в 2 раза больше страниц, чем при выводе по 10.

P.S. вы думаете сейчас сделать по 1 статье выводить? Не советую :-)

06.05.08 12:29 // софтОтветить

А не слишком ли много будет дублирующего контента ? Особенно с тегами, вроде их обычно рекомендуют в ноиндекс сувать или чего-то непонимаю ? :)

06.05.08 13:47 // Ночной КошмарОтветить

Если по одной, то это уже не блог, а пардон, перекидной календарь получается… :-)
А что касается архивов, то заметил неприятную особенность — через какое-то время (примерно через неделю после индексации этих страничек Яшей), они у меня полностью выпадают из индекса.

06.05.08 19:35 // RaftKornОтветить

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

07.11.08 18:57 // str15aОтветить

Неплохо.

08.05.08 23:12 // МашкаОтветить

Очень неплохо.

09.15.08 20:29 // WTОтветить

плагин Related Posts в помощь перелинковке

10.08.08 14:40 // profitraderОтветить

Статья понравилась!!

10.13.08 13:51 // mikkitakiОтветить

Есть ли смысл делать сателлиты на бесплатных хостингах типа blogger?

10.13.08 15:03 // RaftKornОтветить

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

02.11.09 23:23 // wsxОтветить

а кроме вордпресса на чем ещё хорошие сателлиты получаются? satellite-x и cmssimple — фигня… ищу пока нормальную и простую CMS , но с wordpressom пока ничто сравниться не может (

02.13.09 14:18 // АлексОтветить

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

03.11.10 15:00 // AnticopywriterОтветить

А можно сделать много просто страниц html, скинуть их в туже папочку где лежит index.php и поставить на них много ссылок с главной. (В шкуре руками один раз прописать.)

06.07.10 01:21 // ЕвгенийОтветить

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

Всем удачи!!

03.25.11 20:30 // МанимейкерОтветить

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

06.17.11 20:31 // НатальяОтветить

Спасибо за статью. Нассчет сателлитов с нормальным видом — верное замечание. А то иной сайт читать невозможно — сплошные сео-и-смофишки, а не текст +рекламы вагон товарняка.

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