Код: как на лету переключать дизайн сайта?

Появилась у меня по работе необходимость для разных страниц клиентского сайта загружать разные темы. Не page template – а физические темы, которые находятся по умолчанию в папке /wp-content/themes/.

Соответствующий код я придумал достаточно быстро – просто повесил функцию на init, в которой по нужным мне параметрами проверялось, какая тема должна быть активирована, и если надо сменить – то использовал функцию switch_theme().

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

В итоге вышел у меня вот такой код:

add_action('setup_theme', 'cd_switch_theme', 1);
function cd_switch_theme(){
    // WP global that has part of rewrite rule for current page
    global $path;
    if($path == '/store/'){
        $template = 'new-theme';
        $stylesheet = 'new-theme';
    }else{
        $template = 'old-theme';
        $stylesheet = 'old-theme';
    }
    switch_theme( $template, $stylesheet );
}

Его я поместил в файл /wp-content/sunrise.php, но можно и в любой php файл внутри /wp-content/mu-plugins/. new-theme и old-theme – это имена папок, в которых хранятся файлы соответственно нового и старого шаблона. Вам надо будет написать свое собственное условие, конечно же :)

А теперь подумайте о возможностях – менять шаблон в зависимости от настроек пользователя, менять дизайн в зависимости от того, на какую страницу он зашел…

комментариев 20

  1. а можно поподробнее применение? как говорится наглядно или в боевых уловиях

    • Боюсь, что нет (не имею права разглашать свои боевые условия) :)
      Попробуйте сами – быстрее поймете. Я же достаточно полно все описал.

      • нене, я имел в виду просто смысл переключения. Ну типа “пользователь переходит в раздел … а там другой диз” Ну я вот не улавливаю честно :( для чего применить

        PS давно интересуюсь для чего файл sunrise.php где можно прочесть?

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

        • Для чего – когда вы используете GWOT, когда надо провести usability-тесты, когда хотите подшутить, когда постепенно осуществляете переход на новый шаблон.

          sunrise.php: почитать можно тут.

          Баннер: посмотрите, какие do_action есть в том месте, куда вы хотите вставить свой код. Если нет в том месте – напишите сами (do_action('my_header_banner')). А потом методами WP вставляете туда что угодно:

          add_action('my_header_banner', 'display_my_header_banner');
          function display_my_header_banner(){
          echo 'some code';
          }

  2. Антон:

    Добрый день) Хотел вот что у вас узнать) Хочу нарисовать новый дизайн для бодипресса(опыт в веб дизайне у меня есть) меня интересует такой вопрос, чем то отличается ли шаблон для бодипресса от любого другого шаблона? Есть какие то специальные тэги? и вообще как прикрутить уже готовый дизайн? больгое спасибо) и прошу прощения если я задаю negst вопросы) Вот еще что, хотел сделать переключатель дизайнов, почти так как вы описываете, только чтоб пользователь мог сам выбрать дизайн, который ему нравится из уже предложеннных. например как вот тут http://www.softportal.com/ там несколько цветов сайта) и они сохраняются в куках видимо, потому что выбраный вариант сохраняется на долго)

    • Антон:

      черт, мысль потерял) так вот) продолжение) не подскажете, нет ли готового плагина или скрипта для этого? большое спасибо зараннее)))

  3. Антон:

    добрый вечер, вот еще что вспомнил. У меня у одного шапка сайта обрезается неправильно? Я использую тему BP Columns 1.5.3 от modemlooper нарисовал уже несколько логотипов для сайта, но при вставке их в дизайн(через раздел Внешний вид –> Заголовки)Мой логотип таки появляется на сайте, но внизу линия высотой 2-3 пикселя повторяется линией сверху логотипа, получается что верхняя часть лого как бы вылазит снизу. такое ощущение что я просто делаю дизайн уже чем нужно, но я пробовал разные варианты и если мой логотип больше чем 1250×30 мне предлагают го обрезать, обрезаю и та же картина.

  4. Роман:

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

    • Примерно так:

      if ( is_site_admin() ){
      // переключаем на шаблон А
      }else{
      // переключаем на шаблон Б
      }

      Должно сработать.

      • Роман:

        Кстати, данный код меняет темы на всех сайтах сети, а возможно сделать так что бы он действовал, только, на определенный сайт?

        • Да, конечно. Объявите глобальную переменную $current_blog в функции, внутри if’a добавьте проверку на ID/путь нужного вам сайта.

  5. mu-plugins? Извините, это в какой версии вордпреса? Я думал такой папки давно нет…

    Ну и, наверное ваш код можно просто сделать как мини-плагинчик, верно?

    • /mu-plugins/ есть и в текущей версии. Если ее нет – создайте. Все php файлы, которые там есть, выполняются при загруке ядра. Их не надо активировать – все тоже самое, как и с WPMU.
      Сделать-то можно, только я не вижу особого смысла. Тогда надо и админку сразу, где указывать, какой на какой менять.

      • /mu-plugins/ есть и в текущей версии. Если ее нет – создайте. Все php файлы, которые там есть, выполняются при загруке ядра. Их не надо активировать – все тоже самое, как и с WPMU.

        Супер! А я как раз хотел писать на какой-нить форум об этой возможности. Боюсь только что скоро эту папку могут сделать deprecated :-) ибо есть кнопка enable for network возле каждого плагина.

        И еще немного не в тему к посту, но в тему активирования плагинов для сети. Споршу, вдруг вы знаете. Сейчас есть кнопка активировать плагин для сети. Но как быть если хочется чтобы у пользоветелей срабатывали и настройки плагина, которые вы задаете в одном месте? Допустим, плагин, который выводит на панель вместо скучных виджетов одну сплошную инструкцию пользования сайтом. Если его активировать для сети, то придется проходиться по всем блогам и настраивать сам виджет с инструкцией. Может есть какой-то хак как обойти это и брать настройки для определенных плагинов с главного сайта?

  6. У меня вопрос возник, мы хотим на наш сайт под WP установить BuddyPress. Сможем ли мы использовать нашу основную тему или любую другую стандартную тему написанную для WP? Или нам надо обязательно переустанавливать шаблон и ставить что-то, что написано специально под BP?

  7. Добрый день
    Подскажите, пожалуйста, можно ли менять тему в зависимости от типа устройства?

    require_once(‘Mobile_Detect.php’); // Подключаем скрипт Mobile_Detect.php

    $detect = new Mobile_Detect; // Инициализируем копию класса

    $some_var = true;

    if ( $detect->isMobile() ) {
    $some_var = false;
    }
    add_action(‘plugins_loaded’, ‘switch_theme_for’);
    function switch_theme_for(){
    // условия только для администраторов
    if( $some_var )
    return;

    add_filter( ‘template’, ‘custom_load_template’ );
    add_filter( ‘stylesheet’, ‘custom_load_template’ );
    }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *