Полезные сниппеты для functions.php: 10 кодов для новичка

Полезные сниппеты для functions.php: 10 кодов для новичка

Что такое 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" при сохранении

Три правила для новичков:

  1. Всегда делайте бэкап перед изменением
  2. Используйте дочернюю тему — иначе код пропадёт при обновлении темы
  3. Не закрывайте файл тегом ?> в конце

Больше статей о 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 — он отключает эмодзи и десятки других ненужных функций одним кликом.

Хостинг для WordPress от TimeWeb

Сниппет 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 может положить сайт — белый экран вместо страниц. Три способа безопасно тестировать код:

Локальный сервер
Поставьте Local by Flywheel (бесплатный) — тестируйте код на копии сайта на компьютере.
Плагин Code Snippets
Бесплатный плагин — добавляйте PHP-код через админку. Если код ломает сайт, плагин автоматически отключает его.
Дочерняя тема
Всегда правьте 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 — не используйте. Лучший способ — тестировать на локальной копии сайта.

Плагин Clearfy PRO — оптимизация WordPress
Поделиться:
Telegram ВКонтакте