WordPress. functions.php: ошибка, которую совершают все.

WordPress. functions.php: ошибка, которую совершают все.

или “Почему нельзя изменять functions.php?

Какое восхитительное свойство WordPress делает его практически универсальным инструментом для создания интернет-ресурсов? “Платформность” – свойство, позволяющее (но не гарантирующее!) независимость самой cms, контента, функционала и визуального оформления.

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

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

wpeyeИ тем не менее, чему нас постоянно учат всякие “гуру” веб-дизайна? Одной большой глупости: модификации файлов темы визуального оформления для изменения функционала сайта. Бред? Конечно!

И все мы регулярно правим руками код шаблонов страниц, файлы стилей, файл подпрограмм темы – functions.php, дописывая в них все, что считаем нужным. Что в итоге?

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

Разумеется, встраивание функционала, особенно связанного с отображением, в файлы темы – это нормально. Но не стоит путать “функционал, связанный с отображением” с “любым функционалом”!

В целом, править код шаблонов и файлы темы, разумеется, можно… только если это ваша (вами написанная) тема, и все ее обновления – это те изменения, которые вносите вы сами.

А если нет? Что называется, “если нельзя, но очень хочется”?

functions-php-thumb-2Тогда, во-первых, надо думать. Это самый первый шаг всегда. 🙂

А во-вторых, стараться использовать инструментарий, позволяющий разделять сущности даже тогда, когда разделить их вроде бы нельзя.

Для начала, все изменения в файлах темы надо производить не в исходной теме, а в дочерней. Дочерняя тема – это такая “накладка” на исходную, которая позволяет вносить в нее любые изменения, не затрагивая файлов самой темы, а главное, эти изменения не будут зависеть от обновлений исходной темы. То есть, при обновлении исходной темы дочерняя не меняется, однако, при этом весь новый функционал, графические элементы и т.п. – добавляются в соответствии с обновлением.

Для создания дочерней темы можно воспользоваться соответствующей статьёй кодекса WordPress и делать все вручную, а можно использовать специальный плагин, который позволит создать дочернюю тему автоматически, а также обеспечит удобную дальнейшую работу с ней. Можно использовать плагины Child Theme Configurator, Child Theme Creator by Orbisius или One-Click Child Theme. Лично мне больше нравится первый.

Многое в темах нас не устраивает, особенно в бесплатных (хотя и в платных тоже). Лично мне вообще не понятен смысл, платить деньги за тему (когда есть тысячи бесплатных), а потом её ещё и переделывать. Проще найти бесплатную и переделать её так, как хочется. Первый шаг на этом пути – создание дочерней темы, второй – правка файла каскадных стилей дочерней темы (style.css). Разумеется, можно править этот файл руками – в текстовом редакторе. А можно воспользоваться специальными инструментами, например, очень хорошим визуальным редактором – SiteOrigin CSS, одна из его особенностей – изменения, внесенные в файл стилей, не исчезнут при обновлении темы. Кроме того, можно воспользоваться плагинами My Custom CSS или My Custom Styles – они функционально попроще, но тем не менее, вполне подходят для внесения изменений в каскадные таблицы стилей темы, которые также не пропадут при обновлении.

Можно пойти дальше и заняться непосредственно функционалом. Правильно, файлом functions.php. Весь дополнительный функционал, который хочется добавить на сайт – традиционно (по советам “гуру”) пихается в этот файл. Результат понятен: ни сменить тему, ни обновить. Особенно, спустя пол-года – год после создания сайта, когда уже сам черт не разберет, где в этом файле что. Здорово? Безумно… до слез…

Самый простой способ – использовать специальный плагин, который позволяет редактировать не сам файл, а только дополнения к нему, не зависящие от изменения файлов темы.Обычно я использую плагин My Custom Functions или Functionality.

icon-256x256В принципе, этого достаточно для того, чтобы разъединить тему визуального оформления и ваши дополнительные настройки, а также дополнительный функционал.

Однако, и это не совсем правильно. За функционал в WordPress отвечают плагины. Следовательно, для добавления или изменения функционала правильнее всего написать свой плагин, в который и добавлять необходимый php-код. Но вот именно написание своего плагина почему-то вызывает у большинства разработчиков страх, плавно переходящий в ужас, ставит их в тупик и заставляет трусливо открывать в редакторе файл functions.php из текущей темы для того, чтобы его курочить и дописывать… А потом ужасаться, что все пропало при обновлении темы.

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

Как вариант, стоит создать не просто плагин, а так называемый MU-плагин. Такой плагин не отключается и загружается раньше всех остальных. Для этого создаем папку /wp-content/mu-plugins/. В этой папке будут лежать наши MU-плагины – простые файлы с php-кодом, который мы изначально планировали записывать в файл functions.php.

На странице плагинов в админке такие плагины попадают в раздел “Необходимые”.  В отличие от обычных плагинов, здесь подключаются только сами файлы, непосредственно находящиеся в папке. Если вы хотите подключить файлы, находящиеся во вложенных папках, придется создать специальный загрузчик.

Тут все просто: допустим, у вас есть подпапка my-plugin, в которой лежит файл плагина plugin.php. Тогда в самой папке mu-plugins надо создать файл load.php со следующим кодом:

<?php
require_once ‘my-plugin/plugin.php’;
?>

Таким образом, для расширения функционала, особенно не связанного с данной темой – не надо лезть в файл functions.php, надо всего лишь создать свой плагин – это ничуть не сложнее. Правда!

И еще одно полезное замечание: когда требуется вывести на странице что-нибудь хитровывернутое, “гуру” точно так же предлагают лезть переписывать код шаблонов страниц или, на худой конец, клонировать подходящий шаблон и переписывать код уже в нем. Понятно, что после этого рабочая тема также становится необновляемой. 🙁

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

Код самого шорткода можно также разместить в плагине.