Больше никакой плагиномании: решаем задачи одним кодом (хитрости functions.php)
Каждый новый плагин — это потенциальная дыра в безопасности, нагрузка на сервер и риск конфликта. Что, если самые распространённые задачи можно решить парой строк кода в functions.php вашей дочерней темы? Вы получите контроль, скорость и изящное решение без лишнего балласта.
Вот набор мощных функций, которые заменят десяток популярных плагинов.
1. Защита от спама в комментариях (вместо Akismet Lite)
Вместо тяжёлого AI-фильтра можно поставить простые, но жёсткие правила для полей комментариев.
// Запрет на ссылки в поле комментария и проверка на заполненность полей add_filter('preprocess_comment', 'my_spam_protection'); function my_spam_protection($commentdata) { // Запрещаем ссылки в комментарии if (strpos($commentdata['comment_content'], 'http://') !== false || strpos($commentdata['comment_content'], 'https://') !== false) { wp_die('Ссылки в комментариях запрещены.'); } // Проверяем, что поле "сайт" пустое (часто используется ботами) if (!empty($commentdata['comment_author_url'])) { wp_die('Поле "Сайт" должно быть пустым.'); } return $commentdata; }
2. Собственный favicon и логотип (вместо многофункциональных SEO-плагинов)
Зачем тянуть целый плагин, чтобы поменять иконку? Добавьте в админку и на фронтенд свои значки.
// Добавление favicon и логотипа для админ-панели add_action('login_head', 'my_custom_favicon'); add_action('admin_head', 'my_custom_favicon'); add_action('wp_head', 'my_custom_favicon'); function my_custom_favicon() { echo '<link rel="icon" type="image/x-icon" href="' . get_stylesheet_directory_uri() . '/images/favicon.ico" />'; } // Смена логотипа на странице входа add_action('login_head', 'my_custom_login_logo'); function my_custom_login_logo() { echo '<style> .login h1 a { background-image: url(' . get_stylesheet_directory_uri() . '/images/logo-login.png) !important; background-size: contain; width: 200px; height: 100px; } </style>'; }
3. Оптимизация заголовков и мета-тегов (лёгкая SEO-замена)
Базовые SEO-настройки можно прописать вручную, убрав лишнее.
// Удаление ненужных мета-тегов и скриптов remove_action('wp_head', 'wp_generator'); // Версия WordPress remove_action('wp_head', 'wlwmanifest_link'); // Windows Live Writer remove_action('wp_head', 'rsd_link'); // Really Simple Discovery remove_action('wp_head', 'rest_output_link_wp_head'); // REST API link remove_action('wp_head', 'wp_oembed_add_discovery_links'); // oEmbed links // Добавление простого мета-описание (если тема не поддерживает) add_action('wp_head', 'my_simple_meta_description'); function my_simple_meta_description() { if (is_single() || is_page()) { global $post; $description = strip_tags($post->post_excerpt) ?: wp_trim_words(strip_tags($post->post_content), 20); echo '<meta name="description" content="' . esc_attr($description) . '" />' . "\n"; } }
4. Отложенная загрузка изображений (ленивая загрузка, Lazy Load)
Встроенная ленивая загрузка WordPress не всегда идеальна. Можно улучшить её или добавить свою.
// Добавление атрибута loading="lazy" ко всем изображениям add_filter('the_content', 'my_add_lazy_loading'); function my_add_lazy_loading($content) { return preg_replace_callback('/(<img[^>]+)/', function($matches) { $img = $matches[1]; if (strpos($img, 'loading=') === false) { $img = preg_replace('/<img(.*?)>/i', '<img$1 loading="lazy">', $img); } return $img; }, $content); }
5. Создание шорткодов для часто используемого контента (вмевода плагинов шорткодов)
Создавайте собственные шорткоды для контактной формы, кнопок или таблиц.
// Шорткод для вывода текущего года (удобно для футера) add_shortcode('current_year', 'my_current_year_shortcode'); function my_current_year_shortcode() { return date('Y'); } // Использование: [current_year] // Шорткод для кнопки add_shortcode('button', 'my_button_shortcode'); function my_button_shortcode($atts, $content = null) { $atts = shortcode_atts([ 'url' => '#', 'color' => 'blue' ], $atts); return '<a href="' . esc_url($atts['url']) . '" class="my-btn my-btn-' . esc_attr($atts['color']) . '">' . $content . '</a>'; } // Использование: [button url="https://wpbox.by" color="red"]Текст кнопки[/button]
6. Безопасность: ограничение попыток входа (простая защита от брутфорса)
// Защита от множественных попыток входа add_filter('authenticate', 'my_login_protection', 30, 3); function my_login_protection($user, $username, $password) { if ($username && !$password) { // Задержка при пустом пароле sleep(2); } return $user; } // Перенаправление с URL wp-login.php на кастомный адрес add_action('login_form_login', 'my_custom_login_url'); function my_custom_login_url() { if ($_SERVER['REQUEST_URI'] == '/wp-login.php') { wp_redirect(home_url('/my-secret-login/')); exit(); } }
7. Управление ревизиями и автосохранениями (оптимизация БД)
// Ограничение количества ревизий для каждого поста define('WP_POST_REVISIONS', 3); // В файле wp-config.php // Или полное отключение для определённых типов записей add_filter('wp_revisions_to_keep', 'my_limit_revisions', 10, 2); function my_limit_revisions($num, $post) { if ($post->post_type == 'product') { // Для товаров WooCommerce return 0; } return 3; } // Увеличение интервала автосохранения (уменьшает нагрузку) define('AUTOSAVE_INTERVAL', 160); // В секундах (в wp-config.php)
Важные правила перед внедрением:
- Всегда используйте дочернюю тему — чтобы не потерять изменения при обновлении основной.
- Тестируйте на копии сайта (staging) перед применением на боевом.
- Добавляйте код постепенно — по одной функции, проверяя работу сайта.
- Комментируйте код — чтобы через месяц вспомнить, зачем это добавили.
Итог
Эти примеры — лишь вершина айсберга. Файл functions.php — это ваш личный швейцарский нож в мире WordPress. Научившись им пользоваться, вы:
- Уменьшите зависимость от плагинов
- Ускорите сайт (меньше кода — быстрее загрузка)
- Повысите безопасность (каждая строка кода под вашим контролем)
- Глубоко поймёте систему изнутри
Начните с малого — замените один простой плагин. Вы удивитесь, насколько это интересно — решать задачи самому, а не искать очередной плагин в маркетплейсе.