ZarahioN Presents

Answering why

Old-web

SymLinks to the rescue! Использование одной темы на нескольких WordPress сайтах

Вроде бы странное желание, делать одинаково выглядящие сайты, не так ли? Но тем не менее, у меня появилась такая нужда.

Дело в том, что на данный момент дизайном и созданием нескольких тем у нас заниматься некому, а у сайта издательства есть «неплохая» доработанная нами ранее тема (склеенная и немного перекрашенная Rambo от Webriti + капелька функционала сверху). И в начале я думал (и собственно попробовал) просто скопировать ее, но быстро понял, что если я внезапно решу подправить что-то где-то, придется страдать и копировать туда-сюда, и не дай Ишвар сделать разные изменения в одних и тех же файлах одновременно.

Поэтому мне в голову пришло гениальное решение. Почему бы не вынести тему в отдельную общую директорию? Придумано, найдено, сделано. У WP есть встроенный функционал для добавления новых директорий под темы (и не только)

Но немного не получилось, WP по глупости своей пытается подставить полный физический путь в возврат get_stylesheet_directory_uri или get_template_directory_uri вместо стандартного wp-content/themes/theme-name.

Почему? Все достаточно просто, этот функционал (скорее всего) предназначен для добавления файлов темы плагинам, к примеру, чтобы переписать часть темы или что-нибудь такое. Таким образом любой загружаемый через собранную из  get_template_directory_uri или get_stylesheet_directory_uri функций файл будет иметь некорректный путь. Мне же нужна одна общая для двух установок директория из которой они одновременно берут файлы одной темы.

Что же делать?

В начале я подумал подключить общую директорию дополнительным под-доменом и брать файлы оттуда заменив вызовы get_stylesheet_directory_uri  на get_stylesheet, который дает название темы, но я быстро понял, что это будет не очень надежный путь и все можно сделать куда проще.

Убираем register_theme_directory и идем в терминал, пора потрудиться.

Для справки, на момент написания статьи у нас стандартная установка apache на виртуальной ubuntu настроенная через sites-available файлы-конфиги виртуальных хостов, каждый сайт имеет свою директорию под /var/www/<site-name>, общая директория имеет структуру /var/www/shared/themes/<theme-name>.

Думаю, имевшие дело с Linux и пару извращенцев старательно чистившие чрезмерно маленький системный раздел на Win знают о таком интересном инструменте как Symbolic (или Hard) Link. Это по сути возможность создать ссылку, которую система и практически все современные программы будут «считать» реальным файлом или директорией — смогут пройти по ней и читать-редактировать-удалять файл или директорию на которую ссылается ссылка.

Итак, какой план? Вместо калупания конфигурации WP и изменений темы, (http-)ссылок и прочего, мы используем доступный функционал системы (благо апач успешно путешествует по ссылкам, разве что надо будет глянуть, какие угрозы безопасности это может сулить) и сделаем небольшие ссылки на нужную (каждую) нам тему:

ln -d -s /var/www/shared/themes/rambo-child /var/www/dev/wp-content/themes/rambo-child

Что создаст ln символьную -s ссылку dev/wp-content/themes/rambo-child, которая указывает на директорию -d shared/themes/rambo-child.

Проверяем, успех!

Паттерн комманды ln получается таким:

ln <target> <from>

(Мне казалось цель и откуда должны быть наборот, ну да ладно).

Полную справку можно почитать через man ln, а мы, пожалуй, завершаем наше небольшое путешествие.

Recap, to say. Мы (после долгого введения) вынесли необходимую тему в отдельную директорию, доступную апачу, убрали оригинал этой директории из wp-content/themes и создали вместо нее символьную ссылку на директорию, ссылающуюся на созданную нами копию темы.

Думаю, весь процесс достаточно прост, однако могут возникнуть проблемы, если у апача нет доступа к созданной директории или если он не может путешествовать по ссылкам (я, кажется, припоминаю такую настройку).
Плюс нужно учитывать проблему менеджмента — если кто-то запорит (ну или просто поменяет) тему на одном сайте, она меняется везде.

Но на этом, пора прощаться.