ГлавнаяТемыВся правда о functions.php

Вся правда о functions.php

Одной из самых частых ошибок начинающих разработчиков WordPress — это использование файла темы functions.php не по назначению. В данной статье мы раскроем все мифы о данном файле и расскажем в каких случаях стоит его использовать.

Что такое functions.php

Если вы хоть раз открывали исходный код любой темы для WordPress, вероятно вы сталкивались с файлом под названием functions.php.

Файл functions.php

Файл functions.php

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

Файл functions.php загружается при каждом запросе любой страницы в WordPress, включая запросы в панель администрирования и AJAX запросы. Это дает разработчикам темы возможность изменять любые аспекты их проекта на WordPress, а не только то, что связано с внешним видом.

К сожалению многие уроки WordPress в сети Интернет (серии «без плагинов») предлагают вставлять блоки кода именно в файл functions.php активной темы, потому что редактировать этот файл легче, чем создавать новый плагин, особенно через редактор файлов в панели администрирования WordPress.

Редактор файлов темы в WordPress

Редактор файлов темы в WordPress

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

Чем functions.php отличается от плагина

Если коротко — то ничем.

Если взглянуть на порядок загрузки ядра WordPress в файле wp-settings.php, то мы увидим что файл functions.php активной темы загружается немного позднее всех активных плагинов, но данный порядок не дает каких-либо преимуществ или недостатков. А содержание файла functions.php и файлов плагинов подключаются и выполняются идентичным образом.

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

Мифы о производительности functions.php

Некоторые источники утверждают, что functions.php работает быстрее чем плагины, и иногда даже советуют переместить код из файла плагина в файл functions.php для его «ускорения». Это неправда.

Как мы уже упомянули, файлы плагинов и файл functions.php подключаются и исполняются идентичным образом, и PHP код размещенный в плагине и в файле functions.php будет выполняться с абсолютно одинаковой скоростью.

Список активных плагинов в базе данных WordPress хранится в одной опции, которая будет выбираться с одинаковой скоростью, независимо от количества активных плагинов. Иными словами, количество активных плагинов не влияет на скорость работы сайта на WordPress. Влияет лишь их содержание, ровно так же как и содержание файла functions.php.

Когда следует использовать functions.php

Как было сказано ранее, файл functions.php предназначен для функционала, связанного с темой или внешним видом сайта. Ниже представлен список примеров того, что следует писать именно в файле functions.php:

  • Установление ширины содержимого в WordPress
  • Объявление доступных разделов для виджетов в теме
  • Установление пути к файлам локализации темы
  • Объявление поддержки миниатюр и их размеры
  • Объявление поддержки навигационного меню в теме
  • Подключение требуемых скриптов и стилей для темы
  • Подключение стилей темы для визуального редактора
  • Создание раздела с настройками темы
  • Создание дополнительных элементов управления в конфигураторе темы
  • Дополнительные функции используемые в шаблонах темы

Список далеко не исчерпывающий, но дает понять какого рода функционал стоит хранить в файле functions.php. Для контрастности приведем короткий список сниппетов, которые не стоит хранить в functions.php:

  • Код счетчиков Google Analytics или Яндекс.Метрики
  • Произвольные типы записей или таксономии в WordPress
  • Дополнительные скрипты и стили, не связанные с темой
  • Дополнительные роли и привилегии
  • Код для вставки рекламных баннеров в содержимое сайта
  • Отключение RSS лент
  • Скрытие версии ядра WordPress (этого делать вообще не стоит)
  • Скрытие верхнего меню администрирования WordPress
  • Отключение ревизий записей
  • Отключение функций pingback/trackback
  • Любые шорткоды

При столкновении с очередным отрывком кода, попробуйте задать себе простой вопрос — что произойдет при смене активной темы в WordPress? Если ваш ответ «перестанут работать счетчики посещаемости», «пропадут все произвольные типы записей», и т.д. то данный отрывок лучше хранить в виде плагина.

Как создать свой плагин

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

<?php
/**
 * Plugin Name: Моя альтернатива файлу functions.php
 */

// Ваш код здесь

Сохраните этот файл под названием my-functions.php и разместите его в директории wp-content/plugins. После этого перейдите в раздел Плагины в панели администрирования WordPress и активируйте его.

Собственный плагин для WordPress

Собственный плагин для WordPress

Также советуем не хранить все сниппеты в одном единственном плагине, а разбивать их на более мелкие отдельные плагины, чтобы с ними было удобнее работать.

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

mu-plugins как альтернатива

В WordPress есть специальный вид плагинов, которые называются «must use» или mu-plugins. Эти плагины активны по умолчанию, и деактивировать их через панель администрирования возможности нет. В mu-plugins также отсутствует требование к заголовку PHP файла (Plugin Name и т.д.), поэтому код можно писать сразу после открытия тега <?php.

Подобные плагины необходимо размещать в директории wp-content/mu-plugins. Если такая директория у вас отсутствует, вы можете ее создать.

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

Так что в следующий раз, когда вы наткнетесь на статью про WordPress из серии «как сделать … без плагинов», не спешите вставлять код в файл темы functions.php — возможно данный код имеет смысл хранить именно в виде плагина.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • versusbassz

    | список сниппетов, которые не стоит хранить в functions.php
    виджеты, скорее всего, тоже кандидат в этот список

    | одной из самых частых ошибок начинающих разработчиков WordPress — это использование файла темы functions.php не по назначению.
    я так люблю ошибаться =)

    • Согласен, произвольные виджеты тоже можно включить в список того, что не стоит писать в functions.php. Даже если виджет был написан специально под определенную тему, смена темы может повлечь за собой потерю данных в этом виджете. Если же виджет выполнить в виде плагина, то у пользователя будет хотя бы шанс скопировать содержимое и вставить его например в новый текстовый виджет.

    • Да, виджеты – та ещё больная тема.

  • Да, все очень правильно. Я для своих сайтов под какие-то конкретные правки именно для этого сайта использую mu-plugins. Стуктура примерно такая:

    mu-plugins
    — load.php
    // в этом файле подключаем все необходимые **/plugin.php
    — feature-one
    — — plugin.php
    — feature-two
    — — plugin.php

    // …
    И потом Grunt с Rsync удобно синхронизировать все это после обкатки на тестовом сайте.

    • Не могли бы вы немного подробнее раскрыть содержимое последней строки?

  • Ne Davydov

    Ура вы живые

    • Живы, просто были немного заняты проведением конференции ;)

  • Евгений

    Спасибо, полезная информация.

  • Артем

    Я всегда говорил что плагин по нагрузке ничем не отличается от function.php, это все миф! И вот Вы теперь его окончательно развеяли! Спасибо за статью изъял для себя полезные моменты, например по mu-plugins и не знал даже ))

  • Отличная статья, спасибо. Действительно многие пытаются запихнуть в functions.php все что только возможно. Потом начинают стонать, когда тему обновлять нужно.

    • Что б при обновлении темы, не слетал дизайн и функции, нужно создать дочерную тему.

  • Андрей

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

  • О, а вот это круто. *пошёл обновлять все свои темы*

  • Насчёт списка расширений я так скажу: название папки соответствует программному имени расширения, так что здесь всё верно. Но если нужно именно имя, то тут надо, наверное, через WordPress API обращаться – потому что там, по-видимому, сложный процесс получения имени главного php-файла расширения. Я вот сейчас посмотрел, и вижу такое:
    – имя php == имя папки
    – в первом комментарии любого из php есть “Plugin Name”
    – index.php либо отсутствует, либо он есть, но там “silence is golden”
    – ???

    • При поиске плагинов WordPress делает полный обход директории wp-content/plugins и ищет в .php файлах заголовок плагина, это тот, что закомментирован Plugin Name и т.д., т.е. сам файл может лежать как в wp-content/plugins, так и в wp-content/plugins/my-plugin. Также самое название .php файла может быть любым, важен лишь заголовок.

      С mu-plugins (о чем пишет Николай) ситуация немного другая. Must-use плагинам заголовки не нужны, WordPress делает нерекурсивный обход только самой директории mu-plugins, и подключает каждый .php файл, несмотря на наличие или отсутствие заголовков, а вот под-директории в mu-plugins WordPress не трогает, потому Николай и сделал один мю-плагин, который подгружает все остальные из субдиректорий.

      • А вот TGM Plugin Activation использует имя папки расширения как “slug” – “The plugin slug, which is typically the name of the folder that holds the plugin.” – то есть не всегда имя папки == slug? Как тогда узнать slug?

        • Я никогда не работал с TGM но я подозреваю что этот тот слаг, который используется для проверки на обновление или для установки с WordPress.org или произвольный подобный API.

  • Да, именно то, что нужно!

  • Здравствуйте, подскажите как перенести текст з функции темы? Если я просто копирую код — то получаю ошибку

    Код такой

    «function create_meta_desc() {

    global $post;

    if (!is_single()) { return; }

    $meta = strip_tags($post->post_content);

    $meta = strip_shortcodes($post->post_content);

    $meta = str_replace(array(«n», «r», «t»), ‘ ‘, $meta);

    $meta = substr($meta, 0, 125);

    echo «»;

    }

    add_action(‘wp_head’, ‘create_meta_desc’);»

    В функции темы всьо работает

  • Здравствуйте, если я пробую перенести с functions.php
    в файл плагина вот такой код

    function create_meta_desc() {
    global $post;
    if (!is_single()) { return; }
    $meta = strip_tags($post->post_content);
    $meta = strip_shortcodes($post->post_content);
    $meta = str_replace(array(«n», «r», «t»), ‘ ‘, $meta);
    $meta = substr($meta, 0, 125);
    echo «»;
    }
    add_action(‘wp_head’, ‘create_meta_desc’);

    То у меня показывает ошибку, в самом functions.php код работает, как мне быть?

    Ошибка
    Parse error: syntax error, unexpected ‘function’ (T_FUNCTION)

    • Опубликуйте полный текст плагина и полный текст ошибки на pastebin.com и пришлите ссылку.

  • Ольга

    Здравствуйте! А если мне нужно создать сразу 2 плагина my-functions.php, как можно назвать второй? my-functions1.php, например?

    • Ольга, файл плагина вы можете назвать как вам угодно. my-functions.php это всего лишь пример, само название может быть wpmag-amazing-plugin.php.

  • Дмитрий

    А почему нельзя удалять лишние коды с head? Например RSS ленту или информацию о версии вордпресс?

    • Можно, но смысла в этом никакого нет.

      • Я например сумасшедший оптимизатор, и для меня соотношения текста и кода на странице, даже в одну строчку , ранит прямо в сердце.
        + могут парсить через rss ленту, всякие синонимисты.

  • Спасибо, еще раз убедился, что плагины очень удобная вещь. Зачем перегружать файл functions.php пазличными сниппетами. Но народ не переубедишь.
    Например «Без плагина». Скрипт и файл стилей к нему, которые добавляются в тему — это и есть плагин, расширение. Я так и пишу последнее время у себя.

  • IDDQD

    полезная информация. не забыть бы.
    имею несколько строчек в функциональном файле, в принципе можно и перенести в плагин а можно и не заморачиватся, строчек то всего несколько.

  • Kosss

    Любопытно, спасибо. Подскажите, можно ли тогда через плагин подключать дополнительные переводы, чтобы не редактировать functions.php? Вот к примеру, я делаю сайт, внес множество правок в шаблон и в плагины и сформировал из правок свой текст_домейн и свой po/mo файл. По понятным причинам (шаблон коммерческий и обновляется) я не хочу хардкодить подключение нового mo-файла внутрь него. Мне бы написать плагинчик и вставить все туда. Не подскажете как это сделать?

    • Можно плагинчик, но если это относится напрямую к теме, то лучше использовать дочернюю тему.

      • Kosss

        Сделал подключение дополнительного языка плагином. Плюс в том, что можно выбирать разные варианты перевода переключая плагины (для меня немного актуально). Дочернюю тему и так использую (ибо очень много изменений внес), но вот языки к ней не подцепляются. Работают только из папки материнской темы. Так то я только за — вынести все изменения в дочернюю, чтобы при обновлениях материнской вообще голову не включать. И function.php тоже работает только в материнской теме. Это конечно нужно бы поправить, т/к хочешь не хочешь иногда что-то требуется там исправить.