Файл functions.php темы в WordPress: назначение, ошибки, советы

Файл functions.php темы в WordPress

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

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

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

Содержание:

  • Особенности functions.php
  • functions.php против плагинов
  • Для чего на самом деле нужен functions.php
  • Как загружается functions.php
  • Ошибки в functions.php при вставке кода
  • Четыре вещи, которые следует помнить:
    • 1 Правильная вложенность

    • 2 Нет разрывов строк, пробелов и текста перед <?php и после ?>

    • 3 Использование <?php и ?> внутри PHP-функции

    • 4 Кодировка

Особенности functions.php

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

Например, следующий код, вставленный в файл functions.php, добавляет поддержку миниатюр постов:


add_action( 'after_setup_theme', 'wp_kama_theme_setup' );
function wp_kama_theme_setup(){
// Поддержка миниатюр
add_theme_support( 'post-thumbnails' );
}

Другой пример: данный код изменяет текст в подвале админ-панели WordPress, выводя информацию о количестве запросов к базе данных, времени генерации страницы и использовании памяти:


add_filter( 'admin_footer_text', 'wp_usage' ); // в админ-панели
add_filter( 'wp_footer', 'wp_usage' ); // на сайте
function wp_usage(){
echo sprintf(
__( 'SQL: %d in %s sec. %s MB', 'km' ),
get_num_queries(),
timer_stop( 0, 3 ),
round( memory_get_peak_usage()/1024/1024, 2 )
);
}

functions.php против плагинов

"Плагины работают медленнее, чем код в файле functions.php", — утверждают необоснованно. Это неправда!

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

Если же функционал нужен для всего сайта, стоит задуматься о создании плагина.

Второй приме��, указанный выше, не подходит для файла functions.php, так как, изменяя тему, мы потеряем эту функциональность, а она нужна в админ-панели независимо от используемой темы.

Давайте уберем этот код из functions.php и создадим плагин — это просто!

Чтобы создать плагин, вам нужно создать файл с любым именем и поместить в него следующий код. Затем добавьте его в директорию плагинов /wp-content/plugins/ и активируйте плагин в админ-панели:


<?php
/**

  • Имя плагина: любое имя здесь
    */

// код плагина

add_filter( 'admin_footer_text', 'wp_usage' );
function wp_usage(){
echo sprintf(
__( 'SQL: %d in %s sec. %s MB', 'km' ),
get_num_queries(),
timer_stop( 0, 3 ),
round( memory_get_peak_usage()/1024/1024, 2 )
);
}

Если вы не хотите видеть еще один плагин в админ-панели, вы можете использовать плагины Must-Use.

Для чего на самом деле нужен functions.php

Как я уже отметил, файл functions.php необходим для расширения функциональности темы и только для этого! В этом файле нужно добавлять код, который необходим именно для темы, но не для всего сайта.

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

Как загружается functions.php

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

  1. index.php
  2. wp-blog-header.php
  3. wp-load.php
  4. wp-config.php
  5. wp-settings.php

На этом этапе подключаются основные функции и фильтры.

После этого происходит следующее:

  • Включаются must-use плагины: do_action( 'muplugins_loaded' );
  • Подключаются плагины: do_action( 'plugins_loaded' );
  • Устанавливаются глобальные переменные.
  • Затем выполняется событие: do_action( 'setup_theme' );, после чего подгружается файл functions.php.
  • В конце происходит инициализация окружения WordPress: do_action( 'init' );.

Полный процесс загрузки WordPress описан подробно, но это важно для понимания, когда именно загружается functions.php.

Ошибки в functions.php при вставке кода

Меня часто спрашивают об ошибках, например: "После вставки кода в файл functions.php сайт перестал работать — белый экран. Что делать?". Я сам сталкивался с подобным.

Самые частые проблемы связаны с открывающими и закрывающими тегами PHP <?php и ?>. Если вставленный код уже содержит эти теги в начале и в конце, их нужно удалить. Также в файле functions.php не должно быть никакого текста (HTML-кода или других данных). Текст можно выводить только внутри функций, которые будут использоваться в шаблонах или подключаться к хукам.

Кроме того, перед <?php или после ?> не должно быть никаких символов, включая невидимые (например, переносы строк). Это потому, что functions.php загружается до отправки HTTP-заголовков. По правилам PHP контент должен отображаться после отправки заголовков. Все, что находится вне <?php и ?>, считается контентом; даже невидимые символы могут вызвать ошибку белого экрана.

Четыре вещи, которые следует помнить

1 Правильная вложенность

Пример неправильной структуры:


<?php
........здесь код.........
<?php
...... здесь ваш вставленный код ........
?>
........здесь код.........
?>

Правильный вариант:


<?php
........здесь код.........
........ здесь ваш вставленный код ........
........здесь код.........
?>

2 Нет разрывов строк, пробелов, текста перед <?php и после ?>

Ошибка в следующем коде:


<?php
...... здесь код ........
?>
<?php
...... здесь ваш вставленный код ........
?>

Правильнее написать так:


<?php
...... здесь код ........
?><?php
...... здесь ваш вставленный код ........
?>

Или ещё лучше:


<?php
...... здесь код ..........

...... здесь ваш вставленный код ........
?>

Избегайте разрывов строк в самом конце файла functions.php, так как это может вызвать ошибку: после ?> или перед <?php появляется невидимый символ переноса строки n. Многие разработчики, чтобы избежать такой ситуации, вообще убирают закрывающий тег ?>, что допустимо в PHP. Рекомендую всегда делать так:


<?php
... начало файла ...
...... здесь код ........
... конец файла ...

3 Использование <?php и ?> внутри функции PHP

Если в файле functions.php есть функция, вы можете использовать теги <?php и ?> внутри этой функции, например, для визуального выделения HTML-кода:


<?php
... начало файла ...

function function_name(){
?>

html код

}

... конец файла ...
?>

Дело в том, что в этом случае функция лишь определяется и не выполняет никаких действий. Все, что находится внутри функции (между фигурными скобками { }), не работать, пока функция не будет вызвана. Такие функции обычно вызыв��ются из шаблона или через фильтры после отправки HTTP-заголовков. Поэтому в этом примере можно игнорировать разрывы строк и использовать ?> и <?php как угодно.

4 Кодировка

Еще один момент о файле functions.php: устанавливайте кодировку на UTF-8 (UTF-8 без BOM). Иначе, если текст в файле будет на кириллице, он будет отображаться неверно и непонятно.


Теперь вы знаете, как работает файл functions.php и какие ошибки могут произойти при его редактировании. Соблюдайте эти правила, и ваш сайт будет работать без сбоев!

Leave a Reply

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