Что такое functions.php и зачем он нужен? Это файл в папке темы WordPress, где вы добавляете PHP-код для изменения поведения сайта: отключить эмодзи, убрать версию WordPress из head, добавить свой шорткод, изменить длину анонса. Functions.php работает как мини-плагин — но встроенный в тему. В этом гайде — 10 готовых сниппетов, которые можно скопировать и вставить прямо сейчас. Для новичков: всегда делайте бэкап перед изменением functions.php, используйте дочернюю тему и проверяйте код на тестовом сайте.
Что такое functions.php и как с ним работать
Файл functions.php находится в папке вашей темы: /wp-content/themes/ваша-тема/functions.php. Это не шаблон страницы — это файл с PHP-функциями, которые WordPress выполняет при загрузке. По сути, это «мини-плагин» вашей темы.
Каждый раз когда кто-то открывает ваш сайт, WordPress загружает functions.php и выполняет весь код в нём. Поэтому важно: не оставляйте там код, который не используется, и не делайте тяжёлых операций (запросы к БД, обращения к API) на каждый загруз страницы.
Базовая структура файла:
<?php
// Открывающий тег PHP — один раз в начале файла
// Ваш код здесь
add_action( 'wp_enqueue_scripts', 'my_theme_scripts' );
function my_theme_scripts() {
wp_enqueue_style( 'style', get_stylesheet_uri() );
}
// Не закрывайте PHP тег ?> в конце — это может вызвать
// ошибку "headers already sent" при сохранении
Три правила для новичков:
- Всегда делайте бэкап перед изменением
- Используйте дочернюю тему — иначе код пропадёт при обновлении темы
- Не закрывайте файл тегом
?>в конце
Больше статей о WordPress-разработке — в разделе «Разработка WordPress».
Сниппет 1. Убрать версию WordPress из head
По умолчанию WordPress добавляет метатег <meta name="generator" content="WordPress 6.7" /> в head. Это даёт хакерам информацию о версии — они могут искать уязвимости именно для этой версии.
// Удалить метатег generator (версия WordPress)
remove_action( 'wp_head', 'wp_generator' );
// Дополнительно: удалить версию из RSS-ленты
add_filter( 'the_generator', '__return_empty_string' );
// Убрать версию из ссылок на CSS и JS файлы
add_filter( 'style_loader_src', 'remove_version_from_assets' );
add_filter( 'script_loader_src', 'remove_version_from_assets' );
function remove_version_from_assets( $src ) {
if ( strpos( $src, 'ver=' ) ) {
$src = remove_query_arg( 'ver', $src );
}
return $src;
} После установки этого кода версия WordPress исчезнет из исходного кода страниц. Простая и эффективная защита. Подробнее о безопасности — в нашем разделе «Разработка WordPress».
Сниппет 2. Отключить эмодзи
WordPress загружает скрипт wp-emoji-release.min.js на каждой странице — даже если вы не используете эмодзи. Это лишний HTTP-запрос и ~15 КБ JavaScript. Отключаем:
// Полностью отключить эмодзи WordPress
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
// Отключить DNS-prefetch для эмодзи
add_filter( 'emoji_svg_url', '__return_false' ); Или используйте плагин Clearfy PRO — он отключает эмодзи и десятки других ненужных функций одним кликом.
Сниппет 3. Изменить длину анонса записи
По умолчанию WordPress обрезает анонс (excerpt) до 55 слов. Если нужно изменить — используйте фильтр:
// Установить длину анонса в 30 слов
add_filter( 'excerpt_length', function() {
return 30;
} );
// Изменить текст "Читать далее" в анонсе
add_filter( 'excerpt_more', function() {
return '... Читать далее →';
} ); Полезно для блогов и новостных сайтов, где нужно показывать больше записей на странице.
Сниппет 4. Отключить REST API для неавторизованных
REST API WordPress доступен всем — любой может зайти на /wp-json/wp/v2/posts и получить список ваших записей. Если вы не используете REST API в приложениях, отключите его для неавторизованных пользователей:
// Отключить REST API для неавторизованных пользователей
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_not_logged_in',
'REST API доступен только авторизованным пользователям.',
array( 'status' => 401 )
);
}
return $result;
} );
// Убрать ссылку на REST API из head
remove_action( 'wp_head', 'rest_output_link_wp_head' );
remove_action( 'template_redirect', 'rest_output_link_header' ); Сниппет 5. Добавить свой шорткод
Шорткоды — это короткие теги вида [my_shortcode], которые вставляются в контент и заменяются PHP-кодом. Пример шорткода, который выводит текущий год (полезно для копирайта в подвале):
// Шорткод [year] — выводит текущий год
add_shortcode( 'year', function() {
return date( 'Y' );
} );
// Шорткод [button url="https://example.com"]Текст кнопки[/button]
add_shortcode( 'button', function( $atts, $content = null ) {
$atts = shortcode_atts( array(
'url' => '#',
'class' => 'btn btn-primary',
), $atts );
return '<a href="' . esc_url( $atts['url'] ) .
'" class="' . esc_attr( $atts['class'] ) . '">' .
esc_html( $content ) . '</a>';
} ); Использование в редакторе: © 2010—[year] Моя компания автоматически выведет «© 2010—2026 Моя компания».
Сниппет 6. Убрать лишнее из head
WordPress добавляет в <head> множество мусорных тегов: ссылки на RSD, WLW Manifest, shortlink, API ссылки. Они не нужны на 99% сайтов:
// Очистка head от мусорных тегов
remove_action( 'wp_head', 'rsd_link' ); // RSD ссылка
remove_action( 'wp_head', 'wlwmanifest_link' ); // Windows Live Writer
remove_action( 'wp_head', 'wp_shortlink_wp_head' ); // Shortlink
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' ); // oEmbed
remove_action( 'wp_head', 'wp_oembed_add_host_js' ); // oEmbed JS
// Убрать DNS-prefetch
remove_action( 'wp_head', 'wp_resource_hints', 2 ); Это уменьшает размер HTML и ускоряет загрузку. Альтернатива — плагин Clearfy PRO, который делает то же самое через интерфейс.
Сниппет 7. Запретить обновление конкретного плагина
Иногда плагин ломается при обновлении и нужно временно запретить обновление. Или вы сделали кастомную версию плагина и не хотите, чтобы WordPress её перезаписал:
// Запретить обновление конкретного плагина
add_filter( 'site_transient_update_plugins', function( $value ) {
if ( isset( $value->response['plugin-folder/plugin-file.php'] ) ) {
unset( $value->response['plugin-folder/plugin-file.php'] );
}
return $value;
} );
// Замените 'plugin-folder/plugin-file.php' на путь к плагину
// Узнать путь: админка → Плагины → посмотреть в URL Важно: не забывайте потом включить обновления обратно — устаревшие плагины — главная причина взломов.
Сниппет 8. Добавить кастомное поле в профиль пользователя
По умолчанию WordPress не даёт добавить поля в профиль пользователя. Но через хук show_user_profile можно добавить любые поля:
// Добавить поле "Телефон" в профиль пользователя
add_action( 'show_user_profile', 'my_extra_profile_fields' );
add_action( 'edit_user_profile', 'my_extra_profile_fields' );
function my_extra_profile_fields( $user ) {
$phone = get_user_meta( $user->ID, 'phone', true );
?>
<h3>Дополнительные данные</h3>
<table class="form-table">
<tr>
<th><label for="phone">Телефон</label></th>
<td><input type="text" name="phone" id="phone"
value="<?php echo esc_attr( $phone ); ?>" class="regular-text" /></td>
</tr>
</table>
<?php
}
// Сохранить поле
add_action( 'personal_options_update', 'save_extra_profile_fields' );
add_action( 'edit_user_profile_update', 'save_extra_profile_fields' );
function save_extra_profile_fields( $user_id ) {
if ( ! current_user_can( 'edit_user', $user_id ) ) {
return false;
}
update_user_meta( $user_id, 'phone', sanitize_text_field( $_POST['phone'] ) );
}
// Вывести телефон в шаблоне:
// $phone = get_user_meta( get_current_user_id(), 'phone', true );
// echo esc_html( $phone ); Сниппет 9. Автоматически ставить изображение записи на «alt»
Многие забывают заполнять alt у изображений — это плохо для SEO. Этот сниппет автоматически подставляет заголовок записи в качестве alt-текста:
// Автоматический alt для изображений записи
add_filter( 'wp_get_attachment_image_attributes', 'auto_alt_text', 10, 2 );
function auto_alt_text( $attr, $attachment ) {
if ( empty( $attr['alt'] ) ) {
$attr['alt'] = get_the_title( $attachment->post_parent );
}
return $attr;
} Просто и эффективно — все изображения без alt получат alt с заголовком записи.
Сниппет 10. Скрыть пункты меню в админке
Если вы делаете сайт для клиента, часто нужно убрать лишние пункты из меню админки — чтобы клиент не сломал настройки. Этот код скрывает ненужные пункты:
// Скрыть пункты меню в админке для всех кроме админа
add_action( 'admin_menu', 'remove_admin_menu_items' );
function remove_admin_menu_items() {
// Скрывать только для не-админов
if ( ! current_user_can( 'manage_options' ) ) {
remove_menu_page( 'tools.php' ); // Инструменты
remove_menu_page( 'themes.php' ); // Внешний вид
remove_menu_page( 'plugins.php' ); // Плагины
remove_menu_page( 'options-general.php' ); // Настройки
remove_menu_page( 'users.php' ); // Пользователи
}
// Для всех (включая админа):
// remove_menu_page( 'edit-comments.php' ); // Комментарии
} Пункты не удаляются физически — они просто скрываются из меню. Если знать прямой URL, страница всё равно откроется.
Как тестировать сниппеты без риска
Ошибка в functions.php может положить сайт — белый экран вместо страниц. Три способа безопасно тестировать код:
Вывод
Functions.php — мощный инструмент, но с большой силой приходит большая ответственность. Каждый сниппет из этого гайта можно скопировать и вставить — но сначала сделайте бэкап. Если правите functions.php часто — используйте плагин Code Snippets или Clearfy PRO, который объединяет большинство этих настроек в одном интерфейсе.
Больше статей для разработчиков — в разделе «Разработка WordPress». Для профессиональной настройки сайта вы можете обратиться к разработчику.
Что делать если functions.php сломал сайт?
Подключитесь по FTP к серверу, откройте /wp-content/themes/ваша-тема/functions.php и удалите или закомментируйте последний добавленный код. Если белый экран — включите WP_DEBUG в wp-config.php: define(‘WP_DEBUG’, true); — увидите текст ошибки с номером строки.
Чем functions.php отличается от плагина?
Functions.php привязан к теме — при смене темы код перестаёт работать. Плагин работает независимо от темы. Для глобальных функций (SEO, безопасность) лучше использовать плагин. Для функций, связанных с темой (скрипты, стили, шаблоны) — functions.php.
Нужно ли закрывать functions.php тегом ?>
Нет. WordPress официально рекомендует не закрывать PHP-файл тегом ?>. Если после ?> есть пробелы или перенос строки — это вызовет ошибку «headers already sent» и сайт может не загрузиться.
Можно ли использовать functions.php в дочерней теме?
Да, и это рекомендуется. Functions.php дочерней темы загружается ДО functions.php родительской темы. Это значит, что ваш код не пропадёт при обновлении родительской темы. Главное — не дублируйте функции, которые уже есть в родительской теме.
Где найти готовые сниппеты для WordPress?
Хорошие источники: wordpress.stackexchange.com, developer.wordpress.org/reference, блог WPBeginner. Также плагин Clearfy PRO содержит десятки готовых оптимизаций без необходимости писать код вручную.
Безопасно ли копировать сниппеты из интернета?
Не всегда. Проверяйте: использует ли код функции esc_ для вывода, sanitize_ для ввода, nonce для форм. Если видите eval(), base64_decode() или file_get_contents() с внешним URL — не используйте. Лучший способ — тестировать на локальной копии сайта.

