Содержание статьи
Удалите подключение стилей родительской оболочки из functions.php, если стили собираются через Webpack или Vite. Избыточная нагрузка и конфликт кэширования – классическая ловушка. Оставьте только то, что реально используется. Пример удаления:
function remove_parent_styles() {
wp_dequeue_style(\'parent-style\');
wp_deregister_style(\'parent-style\');
}
add_action(\'wp_enqueue_scripts\', \'remove_parent_styles\', 20);
Переопределяете шаблоны? Не копируйте весь файл. Вырежьте только нужный фрагмент и вставьте в свой кастомный компонент. WordPress приоритетно загружает файлы по иерархии. Используйте это. Но не дублируйте функции, если можно переопределить фильтром или хуком.
Важно: любое дублирование кода без веской причины ухудшает поддержку и увеличивает риски при обновлениях.
Избавьтесь от global $post в шаблонах. Лучше использовать get_the_ID()
или передавать ID через аргументы. Глобальные переменные – болото. Одна правка – и всё ломается.
function custom_content_filter($content) {
if (is_singular(\'post\')) {
$content .= \'
Читайте также: ...
\';
}
return $content;
}
add_filter(\'the_content\', \'custom_content_filter\');
Удалите подключение неиспользуемых скриптов через wp_dequeue_script
. Нет необходимости тянуть jQuery, если весь интерфейс на Alpine.js. Экономьте каждый килобайт. Это важно. Время загрузки – конкурентное преимущество.
Внимание! Любой сторонний плагин может сломать кастом, если вы не ограничили его область применения.
Меняете структуру страниц? Используйте template_include
для выбора шаблона, а не десятки условий в index.php. Пример минимализма:
add_filter(\'template_include\', function($template) {
if (is_page(\'kontakt\')) {
return get_stylesheet_directory() . \'/templates/kontakt.php\';
}
return $template;
});
Не переопределяйте функции через if (!function_exists()). Это костыль из прошлого. Используйте хуки, фильтры, объекты. Современный подход – композиция, а не подмена.
Работа с ACF? Заворачивайте поля в проверки. Поле может быть удалено, но вы уже зависите от него. Всегда используйте get_field()
с fallback:
$cta = get_field(\'call_to_action\') ?: \'По умолчанию\';
Подключайте только то, что нужно. Пишите меньше, но точнее. Вопрос не в количестве изменений, а в их обоснованности. Всё остальное – лишний груз.
Настройка шаблона single.php для изменения отображения записей
Сразу перепишите вызов заголовка: вместо the_title()
используйте get_the_title()
в связке с условием, чтобы кастомизировать отображение по типу записи:
<?php if ( get_post_type() === \'product\' ) { echo \'Товар: \' . get_the_title(); } else { the_title(); } ?>
Следом – отключите отображение стандартного контента через the_content()
, если вы используете кастомные поля. Не повторяйтесь. Уберите дубли. Используйте ACF или get_post_meta()
.
<?php echo get_post_meta( get_the_ID(), \'описание_товара\', true ); ?>
Ненавидите громоздкий HTML от редактора? Замените на строгую верстку: вставляйте контент вручную через блоки <section>
с хардкодом. Да, это боль. Но контроль – в ваших руках.
Хотите убрать featured image? Просто вырезайте the_post_thumbnail()
. Или добавьте условие:
<?php if ( has_post_thumbnail() && get_post_type() !== \'новости\' ) { the_post_thumbnail(); } ?>
<?php
$related = new WP_Query([
\'post_type\' => get_post_type(),
\'posts_per_page\' => 3,
\'post__not_in\' => [get_the_ID()],
\'tax_query\' => [[
\'taxonomy\' => \'категория\',
\'field\' => \'term_id\',
\'terms\' => wp_get_post_terms( get_the_ID(), \'категория\', [\'fields\' => \'ids\'] ),
]]
]);
if ( $related->have_posts() ) {
while ( $related->have_posts() ) {
$related->the_post();
echo \'<li>\' . get_the_title() . \'</li>\';
}
wp_reset_postdata();
}
?>
Внимание! Не забудьте сбросить глобальный $post через
wp_reset_postdata()
, иначе получите баги в футере.
Внесите кастомную верстку вместо the_content()
: создайте блоки с <article>
, <aside>
, <figure>
и склейте в нужном порядке. WordPress не запрещает. Но вы – контролируете.
Не трогайте get_header()
и get_footer()
– вместо этого подключайте альтернативные: get_header(\'product\')
, get_footer(\'clean\')
. Создайте их отдельно. Разорвите шаблон на части.
Разработчикам недостаточно? Тогда подключайте template_include
через functions.php
и подменяйте шаблон в рантайме. Это уже не просто PHP – это контроль ядра.
add_filter( \'template_include\', function( $template ) {
if ( is_singular(\'product\') ) {
return get_stylesheet_directory() . \'/single-product.php\';
}
return $template;
});
Никаких универсальных решений. Только точечные правки под задачу. Пишите грязно, но честно. Пусть шаблон работает под вас, а не наоборот.
Подключение собственного стиля через functions.php без потери обновлений
Регистрируй кастомный CSS через wp_enqueue_scripts
. Не трогай оригинальные файлы. Не вставляй код напрямую в header.php
. Используй хук.
Пример минимального и корректного подключения:
add_action(\'wp_enqueue_scripts\', \'load_custom_styles\', 20);
function load_custom_styles() {
wp_enqueue_style(\'my-style\', get_stylesheet_directory_uri() . \'/custom.css\', array(), \'1.0\');
}
Смысл цифры 20 – приоритет. Хочешь, чтобы стили перебили базовые – ставь выше 10. Но тестируй. Иногда придётся использовать !important
, но злоупотреблять этим – тупик.
Файл custom.css
должен находиться в корне. Не в /assets
, не в /css
, а именно рядом с functions.php
. WordPress ищет строго по пути, заданному в get_stylesheet_directory_uri()
.
Не пиши get_template_directory_uri()
. Это сломает всё. Этот вызов тянет путь к родительской структуре. Нам нужна только своя надстройка.
Важно! Не регистрируй стили через
wp_register_style()
, если не знаешь, зачем это. В 90% случаевwp_enqueue_style()
– безопаснее и проще.
Порядок подключения – критичен. Если новый CSS зависит от Bootstrap или Tailwind – добавляй массив зависимостей:
wp_enqueue_style(\'my-style\', get_stylesheet_directory_uri() . \'/custom.css\', array(\'bootstrap\'), \'1.0\');
Если у тебя есть кастомный файл JS – подключай его тоже здесь, тем же хуком. Никогда не привязывай стили к шаблонам напрямую. Это ловушка.
Внимание! Никогда не редактируй
style.css
напрямую. WordPress может перезаписать файл при обновлении структуры. Все добавления – только в отдельный файл.
Хочешь сделать порядок подключения абсолютным? Добавь wp_dequeue_style()
перед своей функцией. Но знай, что это может снести другие зависимости. Применяй осмысленно.
В финале: подключай как инженер, а не как дизайнер. Минимум ручных вставок. Только API WordPress. Так код выживает между обновлениями.
Переопределение хуков родительской темы для кастомизации функционала
Удаляй действия родителя только если уверен в их точке подключения. Неправильный приоритет – и ты ломаешь весь рендер. Используй remove_action
и remove_filter
строго после подключения родительского кода. Лучшее место – after_setup_theme
.
add_action(\'after_setup_theme\', function() {
remove_action(\'wp_head\', \'parent_theme_function\');
});
Не пытайся отключить функцию, если она инлайновая или подключается внутри условия. Проверь исходники. Без этого – пустая трата времени.
- Проверяй приоритеты. Они критичны.
- Дублируй хук своим методом только после удаления родительского.
- Никогда не оставляй оба активными – непредсказуемость обеспечена.
Важно: если ты используешь remove_action в файле functions.php, не забудь, что функции родителя могут не быть загружены к этому моменту. Оберни вызов в хук after_setup_theme или init с приоритетом выше, чем у оригинала.
Для фильтров – аналогичная стратегия. Отключаешь, заменяешь. Но будь внимателен: некоторые фильтры цепляются к массивам или объектам. Их нельзя просто \»вырезать\». Нужно заменить поведение аккуратно.
add_filter(\'excerpt_length\', function() {
return 20;
}, 99);
Работает, если приоритет выше. Если родитель использует 999 – поднимай до 1000.
Некоторые темы внедряют свои хуки внутри классов. Тогда тебе нужен глобальный объект, например:
add_action(\'after_setup_theme\', function() {
global $parent_theme;
remove_action(\'init\', [$parent_theme, \'init_hooks\']);
});
Без доступа к объекту – забудь о переопределении. Придется переписать полностью.
Внимание! Если хук встроен в шаблон без условия, отключить его нельзя – только через override шаблона.
Следи за конфликтами. Один хук, два поведения – результат непредсказуем. Всегда проверяй did_action
и has_action
, чтобы не гоняться за фантомами:
if (has_action(\'wp_footer\', \'some_function\')) {
remove_action(\'wp_footer\', \'some_function\');
}
Используй wp_hooks
плагин для отладки. Он покажет все подключенные действия и приоритеты. Без этого ты работаешь вслепую.
Обходи стороной хуки в шаблонных тегах. Там логика – жесть. Только полное переопределение функции спасет.
Будь хакером, но умным. Не стреляй в систему. Анализируй, тестируй, проверяй. Один хук – один шанс.
Оптимизация загрузки ресурсов через изменение дочерней темы
Отключайте ненужные стили и скрипты. Не используете Gutenberg? Уберите связанные с ним файлы:
function remove_gutenberg_assets() {
if (!is_admin()) {
wp_dequeue_style(\'wp-block-library\');
wp_dequeue_style(\'wp-block-library-theme\');
wp_dequeue_style(\'wc-block-style\');
wp_dequeue_script(\'wp-embed\');
}
}
add_action(\'wp_enqueue_scripts\', \'remove_gutenberg_assets\', 100);
Результат – минус 100–200 КБ на каждой странице.
Заменяйте jQuery на vanilla JS. Чистый JavaScript быстрее и меньше по весу. Подключение jQuery можно отключить:
function remove_jquery() {
if (!is_admin()) {
wp_deregister_script(\'jquery\');
}
}
add_action(\'wp_enqueue_scripts\', \'remove_jquery\', 99);
Оставлять jQuery ради одного слайдера? Глупо.
Важно! Убедитесь, что отключаемый скрипт действительно не используется. Проверяйте консоль браузера после изменений.
Используйте defer и async. WordPress не делает это автоматически. Нужно внедрять вручную:
function add_defer_attribute($tag, $handle) {
$defer_scripts = [\'some-script-handle\'];
if (in_array($handle, $defer_scripts)) {
return str_replace(\' src\', \' defer src\', $tag);
}
return $tag;
}
add_filter(\'script_loader_tag\', \'add_defer_attribute\', 10, 2);
Скрипты перестают блокировать отрисовку. Рендер быстрее. Пользователь доволен.
Собирайте стили в один файл. Множественные подключения CSS через wp_enqueue_style
– зло. Объедините и минифицируйте:
- Пример: style.css + font.css → main.min.css
- Подключайте через одну функцию, избегайте дублирования
Не хотите сборку вручную? Используйте gulp или webpack.
Помните: каждый HTTP-запрос – это миллисекунды, которые вы крадете у пользователя. Уберите их без сожалений.
Заменяйте встроенные стили шрифтов на preload. Ускоряет визуальный отклик:
function preload_fonts() {
echo \'<link rel=\"preload\" href=\"/wp-content/themes/your-theme/fonts/font.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\';
}
add_action(\'wp_head\', \'preload_fonts\');
Особенно актуально при использовании кастомных гарнитур.
Итог. WordPress грузит мусор по умолчанию. Ваше дело – выбросить его. Быстро. Жестко. Без сожалений.