Переключение тем для wordpress
Предыстория
В скором времени должно появиться предложение для клиентов «Типовые решения». Как понятно из названия, оно включает набор типовых шаблонов, с готовым функционалом. Ну не будем пока раскрывать всех тонкостей. Мне, как разработчику, необходимо было подыскать плагин для переключения тем, для так называемого «предпросмотра», чтобы клиенты могли посмотреть все возможные и выбрать. Был вариант еще тупо завести десяток сайтов и для каждого свой шаблон, но это слишком хостингозатратно, хостинг у нас хороший но немного жадный на количество сайтов, всего 10. В общем отказались от этой идеи. Поскольку как-то давно я уже сталкивался с таким плагином, но название не смог вспомнить, то полез в гугл в поисках.
Был найден вот такой интересный плагин WordPress Theme Demo Bar. Все бы хорошо, но по мне он слишком нагружен настройками. Конечно, это не плохо, когда нужна тонкая настройка, только это потребует времени для понимания работы.
На самом деле там дофига плагинов такого рода, но я не полез в дебри.
«Короче Склифосовский!»
Кому надо вышеописанный плагин — можете не благодарить. Но это не путь код-джедаев, и я полез в ковыряния плагина. Все оказалось до банального просто. В движке уже есть готовые хуки для изменения тем, только не хуки, а фильтры. Их всего 2:
Первый подключает папку темы:
add_filter('template','previw_theme');
И второй подключает стили темы, фиг знает почему такая технология, но не будем спорить с разработчиками, им виднее:
add_filter('stylesheet','preview_css');
Самое интересное, что внутри обработчиков надо написать одну строку
return $name_theme;
Где $name_theme — это имя папки где лежит шаблон.
В принципе, это вся основа. А уж как вы будите передавать имя темы, как говорит мой отец: «Ваша фантазия!» В том плагине, который я предложил в самом начале, название темы определяется по URL в адресной строке, мне данная реализация не очень понравилась, поскольку придется ко всем ссылкам на странице добавлять еще дополнительно /?themdemo, не самое красивое решение, на мой взгляд, и я решил воспользоваться технологией куков (coockie). Что я и проделал в плагине. Внешний вид я пока немного позаимствовал, дальнейшее оформление будет потом. Сейчас тут нет совершенно никаких настроек, и в его функции входит только смена шаблона. Если вы вдруг надумаете воспользоваться получившимся плагином, то все стили верхней панели придется менять непосредственно в коде, благо его там не очень много и стили найти легко.
Немного теории:
Хук (англ. крючок) — функция которая вызывается (подцепляется) при совершении определенного действия, например при инициализации страницы, удалении/активации плагина.
Фильтр — фикция, которая вызывается при совершении определенного действия, плюс в эту функцию передается та информация, которая передавалась у инициирующему действию. Например, изменение вывод контента записи. (В общем-то логично, на то он и фильтр, чтобы фильтровать).
По идее одна фигня (но думается мне, что я ошибаюсь), только в фильтр обязательно в качестве параметра передается информация вызывавшего события
На примере the_content() возвращает на «Тра-та-та-та», и если повесить фильтр на это событие, то в обработчике фильтра func_filtr($param), параметр $param равен «Тра-та-та-та». Андестенд?
Принцип инициализации и фильтров и хуков одинаковый «ключевая фраза» add_filter/add_action, и 2 параметра: имя фука/функции и функция обработчик события.
add_action('hook_name','func_act') add_filter('filter_name','func_filt')