Содержание статьи
Не подключайте функции напрямую в файлах дочерней темы. Вместо этого привязывайтесь к уже существующим точкам исполнения ядра и популярных расширений. Это позволяет минимизировать конфликты и сохранять модульность.
Самый частый кейс: изменение структуры заголовков на главной. Не редактируйте header.php
напрямую. Добавьте обработчик на нужную точку. Пример:
add_action(\'wp_head\', \'replace_homepage_title\');
function replace_homepage_title() {
if (is_front_page()) {
echo \'<style>h1.site-title { display: none; }</style>\';
}
}
Внимание! Не вставляйте анонимные функции без крайней необходимости. Они не отключаются. Переподключить их невозможно. В логике – тупик.
Хотите вставить баннер до основного содержимого? Не редактируйте single.php
. Лучше – так:
add_action(\'the_content\', \'insert_banner_before_content\');
function insert_banner_before_content($content) {
if (is_single()) {
$banner = \'<div class=\"custom-banner\">Реклама</div>\';
return $banner . $content;
}
return $content;
}
Расширения типа WooCommerce добавляют собственные точки. Если не знаете, как они названы – включите отладку, пройдитесь по структуре с помощью doing_action()
или включите QUERY MONITOR
.
Важно помнить: корректная приостановка встроенных функций требует знания их имён.
remove_action
не сработает, если вы не указали точно такой же колбэк, что был зарегистрирован.
Подход, основанный на подключении к точкам исполнения, требует понимания контекста. Это не про массовую правку шаблонов, а про минимальные вмешательства, точечные инъекции, стратегические замены. Работайте умнее, не тяжелее.
Добавление кастомного контента в шаблон через хук после заголовка
Решение простое: внедрите свою функцию в точку generate_after_entry_header
, если работаете с GeneratePress. Для других тем ищите аналогичный маркер, расположенный непосредственно после заголовка записи.
Пример кода:
add_action( \'generate_after_entry_header\', \'prefix_insert_custom_block\' );
function prefix_insert_custom_block() {
if ( is_single() ) {
echo \'<div class=\"custom-content\">\';
echo \'<p>Текстовый блок сразу после заголовка.</p>\';
echo \'</div>\';
}
}
if ( is_category( \'novosti\' ) ) {
// Вставить блок
}
Стилизация не менее критична. Без классов кастомный блок сольётся с фоном и потеряет смысл. Используйте уникальный класс и подключайте CSS через wp_enqueue_style
или в файле темы.
Контент может быть любым: иконки, CTA, баннер, форма подписки. Главное – точка входа выбрана правильно. Заголовок – это внимание. После него – действие.
Важно помнить: если вы используете тему на базе блоков (FSE), такой подход не сработает. Там нужна настройка шаблонов через редактор и фильтры
render_block
.
Удаление стандартных действий родительской темы с помощью remove_action
Удаляйте ненужные обработчики немедленно – через remove_action()
, вызываемый в нужный момент. Пропустите это – получите дубли, конфликты и неработающие элементы. Главное – точное совпадение параметров с тем, что добавляет оригинал.
Важно!
remove_action()
не работает, если вы вызываете его до того, как оригинальный обработчик был зарегистрирован.
Алгоритм следующий:
- Определите, где родитель подключает функцию. Найдите
add_action()
. - Скопируйте все три аргумента: название крючка, имя функции, приоритет.
- Вызывайте
remove_action()
на том же крючке, с тем же приоритетом.
Пример: допустим, родительская тема добавляет баннер в шапке:
add_action( \'wp_head\', \'theme_header_banner\', 20 );
Чтобы это убрать в дочерней теме, нужно:
function child_remove_parent_banner() {
remove_action( \'wp_head\', \'theme_header_banner\', 20 );
}
add_action( \'wp_head\', \'child_remove_parent_banner\', 1 );
Почему приоритет 1? Потому что remove_action
должен выполниться раньше, чем add_action
родительской темы.
Помните: если родитель подключает обработчик внутри функции, привязанной к хуку, например,
after_setup_theme
, вы обязаны снимать его уже внутри этой же точки.
В таком случае:
function child_disable_parent_features() {
remove_action( \'after_setup_theme\', \'parent_setup_function\', 10 );
}
add_action( \'after_setup_theme\', \'child_disable_parent_features\', 11 );
Цифры важны. Один промах – и вы удаляете воздух. Или ничего. Проверяйте руками – did_action()
в помощь. Сомневаетесь, вызывается ли оригинал? Выведите лог, поставьте error_log()
.
Может быть, родитель использует анонимные функции или замыкания. Всё – тупик. Удалить такое нельзя. Переписка с разработчиком родителя или форк – единственный выход.
Не перегружайте functions.php
лишними попытками. Отслеживайте структуру – и будьте точны, как хирург.
Подключение скриптов и стилей дочерней темы через wp_enqueue_scripts
Подключение стилей и скриптов в дочерней теме – важная задача. Игнорирование правильного подключения может привести к проблемам с совместимостью или ошибкам загрузки. Обратите внимание, что стоит использовать функцию wp_enqueue_scripts
в functions.php
вашей дочерней темы для регистрации и подключения ресурсов.
Важно! Подключать файлы нужно именно через
wp_enqueue_scripts
, иначе вы рискуете нарушить работу кэширования и зависимостей между скриптами.
Пример подключения стилей:
function my_theme_styles() {
wp_enqueue_style(\'parent-style\', get_template_directory_uri() . \'/style.css\');
wp_enqueue_style(\'child-style\', get_stylesheet_uri(), array(\'parent-style\'));
}
add_action(\'wp_enqueue_scripts\', \'my_theme_styles\');
Что происходит в этом коде? Мы подключаем основной стиль родительской темы и стиль дочерней, при этом устанавливаем зависимость: дочерний стиль загрузится только после родительского. Это важный момент. Подключать файлы нужно в правильном порядке.
Подключение скриптов выглядит аналогично, но с несколькими дополнениями:
function my_theme_scripts() {
wp_enqueue_script(\'child-script\', get_stylesheet_directory_uri() . \'/js/custom.js\', array(\'jquery\'), null, true);
}
add_action(\'wp_enqueue_scripts\', \'my_theme_scripts\');
Здесь подключается JavaScript файл с зависимостью от jQuery. Параметр true
в конце указывает, что скрипт должен загружаться в подвале страницы, что улучшает производительность.
Помните! Порядок подключения скриптов и стилей критичен. Если вы подключите скрипт до его зависимостей, это приведет к ошибкам.
Для более сложных ситуаций, например, когда нужно подключить стили и скрипты только на определённых страницах, вы можете добавить дополнительные условия. Вот пример подключения ресурса только на страницах с определённым шаблоном:
function my_page_specific_assets() {
if (is_page_template(\'template-custom.php\')) {
wp_enqueue_style(\'custom-page-style\', get_stylesheet_directory_uri() . \'/css/custom-page.css\');
}
}
add_action(\'wp_enqueue_scripts\', \'my_page_specific_assets\');
Не забывайте, что правильное использование wp_enqueue_scripts
важно для предотвращения конфликтов между темами и плагинами, а также для лучшей совместимости с обновлениями WordPress.
Задача: поменять последовательность отображения компонентов без прямого вмешательства в шаблоны. Решение – корректировка числовых значений при регистрации функций в механизме событий WordPress.
По умолчанию, WordPress обрабатывает вызовы по возрастанию приоритета. Чем ниже число – тем раньше вызывается функция. Если не указан, считается 10. Простая арифметика.
Допустим, тема подключает два блока: описание и кнопку. Нужно, чтобы кнопка появилась первой. Пример:
add_action( \'woocommerce_single_product_summary\', \'custom_output_button\', 5 );
add_action( \'woocommerce_single_product_summary\', \'custom_output_description\', 15 );
function custom_output_button() {
echo \'\';
}
function custom_output_description() {
echo \'
Описание товара
\';
}
Важно: если две функции зарегистрированы с одинаковым числом, порядок выполнения не гарантирован. Избегайте дубликатов приоритетов без крайней необходимости.
Следите за тем, где вы вмешиваетесь. Некоторые события уже обременены десятками подключений от ядра, плагинов, шаблонов. Иногда лучше снизить приоритет до 1, чем пытаться перебить чужой вызов после 30.
Хотите сдвинуть блок ниже, а не выше? Просто увеличьте значение:
remove_action( \'woocommerce_single_product_summary\', \'default_function\', 10 );
add_action( \'woocommerce_single_product_summary\', \'default_function\', 40 );
Работает безотказно. Но только если точно знаете имя функции. Узнать – с помощью wp_list_pluggable_hooks()
или did_action()
. Без этих знаний легко перезаписать не то.
Внимание! Приоритеты не влияют на содержимое. Только на очередность. Не пытайтесь через них изменить логику работы компонентов – сломаете всё.
Не используйте плагины для этого. Изменения приоритетов – базовая задача, выполняемая в functions.php
. Упрощайте, а не усложняйте.
И ещё: не верьте документации, если в ней нет упоминания приоритета. Уточняйте в исходниках. Только код знает правду.