Вопрос или проблема
Согласно кодексу, при создании дочерней темы вам нужно вручную подключать скрипты родительской темы.
Моя родительская тема имеет логику для условного отображения различных css файлов, кэшированного css и динамического css, сгенерированного из панели Параметры темы. Тема называется Camille.
function camille_scripts() {
wp_register_style('bootstrap', get_template_directory_uri() . '/css/bootstrap.css');
wp_enqueue_style( 'bootstrap' );
//...больше скриптов и стилей
}
function camille_enqueue_dynamic_styles( ) {
//отображает wp_options в физический файл и подключает физический файл
//...
wp_register_style( $cache_file_name, $css_cache_file_url, $cache_saved_date);
wp_enqueue_style( $cache_file_name );
//...
}
Я пытался вызвать эти методы в своем файле functions.php темы…
function my_theme_scripts() {
camille_scripts();
camille_enqueue_dynamic_styles();
}
add_action('wp_enqueue_scripts', 'my_theme_scripts');
Но ничего не подключалось. Я проверил разметку, и ни одного css файла родительской темы не было. Затем я попытался скопировать полный исходный код этих методов в мой functions.php, и все стили отобразились как обычно. Однако я не хочу этого делать, потому что копирование и вставка кода нарушает принцип DRY, и если тема будет обновлена, моя дочерняя тема не получит изменения.
Почему стили моей родительской темы не отображаются в разметке? Есть ли лучшие практики для подключения родительского css, когда родительская тема использует сложную логику для создания и подключения css?
Если необходимые функции находятся в functions.php
родительской темы, то вы можете подключить их в вашем текущем исполняемом functions.php
дочерней темы с помощью следующего вызова:
include( get_template_directory() . '/functions.php');
get_template_directory()
находит директорию родительской темы даже при использовании дочерней темы.
Обратите внимание, что это выполнит все, что может быть выполнено в functions.php
родительской темы. Так что, что бы она ни делала, это произойдет, когда вы ее подключите.
Если в functions.php
родительской темы есть что-то, что вы не хотите подключать, вы всегда можете отключить это ( после вызова get_template_directory()
) в functions.php
дочерней темы с помощью соответствующей функции отключения: wp_dequeue_script()
или wp_dequeue_style()
.
Ответ или решение
Когда вы создаете дочернюю тему в WordPress, важно правильно подключить стили и скрипты родительской темы. В вашем случае, вы используете тему Camille, которая имеет сложную логику для условного подключения CSS-документов. Позвольте мне подробно объяснить, как использовать методы подключения стилей родительской темы, а также предложить правильные практики для этого процесса.
Проблема
Вы указали, что пытались вызвать методы camille_scripts
и camille_enqueue_dynamic_styles
в вашем functions.php
дочерней темы, но CSS родительской темы не отображался в результирующем HTML. Вы также пытались скопировать эти методы в вашу дочернюю тему, что нарушает принцип DRY (Don’t Repeat Yourself).
Почему ваши стили не отображаются
Основная причина, по которой стили не подключаются, заключается в том, что функции camille_scripts
и camille_enqueue_dynamic_styles
могут использовать определенные хуки или условия, которые не выполняются, когда вы вызываете их непосредственно без контекста родителя. Кроме того, возможно, следует учитывать, что детская тема должна корректно взаимодействовать с родительским функционалом.
Лучшие практики для подключения CSS родительской темы
Вместо ручного копирования кода или неэффективного использования функций родительской темы, рекомендуется следовать следующему процессу:
-
Вызов функций через хук: Если вы хотите использовать методы из родительской темы, вызовите их в дочерней теме при помощи подходящего хука. Например:
function my_theme_scripts() { // Проверка, если функция существует if (function_exists('camille_scripts')) { camille_scripts(); // Подключаем скрипты родителя } if (function_exists('camille_enqueue_dynamic_styles')) { camille_enqueue_dynamic_styles(); // Подключаем динамические стили родителя } } add_action('wp_enqueue_scripts', 'my_theme_scripts');
Таким образом, вы будете уверены, что функции родительской темы вызываются только если они существуют.
-
Загрузка файла родительской темы: В некоторых случаях необходимо загрузить все функции файла
functions.php
родительской темы, однако это может вызвать нежелательное поведение, если файл выполняет определенные действия, которые вам не нужны. Вы можете использовать следующую конструкцию с осторожностью:include( get_template_directory() . '/functions.php' );
Но помните, что это приведет к выполнению всего кода из файла, включая возможные регистрации стилей и скриптов, которые вы, возможно, не хотите включать.
-
Отмена подключения ненужных стилей/скриптов: Если в родительской теме есть стили или скрипты, которые вам не нужны, вы можете использовать функции
wp_dequeue_style()
илиwp_dequeue_script()
.function my_dequeue_unwanted_styles() { // Пример отключения стиля wp_dequeue_style('название_стиля_родителя'); } add_action('wp_enqueue_scripts', 'my_dequeue_unwanted_styles', 20);
Заключение
Используя правильный подход к подключению стилей и скриптов из родительской темы, вы можете избежать дублирования кода и обеспечить корректное функционирование вашей дочерней темы. Всегда проверяйте доступность функций перед их вызовом, а также учитывайте потенциальные конфликты с другими скриптами или стилями. Таким образом, вы сможете придерживаться принципов DRY и сохранять возможность обновления родительской темы без проблем.