Как взаимодействуют родительская и дочерняя темы в WP


Дочерняя тема в WordPress –  тема, добавляющая дополнительные стили и функции к родительской теме.  При этом она наследует все функциональные возможности  и  css  родительской темы.  То есть создавая дочернюю тему, мы не создаем тему с нуля, не заменяем ею родительскую тему полностью, а лишь по своему усмотрению переопределяем/добавляем  стили и функции родительской темы. Стандартная ситуация в программировании.

Однако иногда бывает неясно, будет ли WP использовать код из родительской или дочерней темы. Когда дело доходит до файлов шаблонов, таблиц стилей и функций, может быть сложно определить, что используется.

В этой статье мы разберемся, как взаимодействуют родительская и дочерние темы и узнаем когда WordPress использует код из родительской темы, а когда – из дочерней.  Это поможет исправить ситуации, когда код не работает так, как ожидается.

Посмотрим на все типы файлов.

Таблицы стилей (CSS)

И  у родительской темы, и у  дочерней темы должен быть css, потому что тема не будет работать без таблицы стилей.

В  дочерней теме ваша scc файл будет содержать строку кода, которая сообщает WordPress, что это дочерняя тема и которая является родительской темой.  Вот файл для темы, которая используется для этого сайта, она является дочерней темой. Он начинается с  комментария,  который сообщает WordPress, что происходит с темой:

/*
Theme Name: Webeginner
Version: 1.0
Description: A child theme of WordX by MyThemeShop
Template: mts_wordx
Text Domain: mythemeshop
*/

@import url("../mts_wordx/style.css");

С заголовком, надеюсь, все понятно. Функция @import подгружает файл стилей родительской темы, а дальше можно добавлять свои стили.
Таким образом, в дочерней теме используется своя таблица стилей, созданная на основе родительской.

Файлы шаблонов

Посмотрим на файлы шаблонов тем. Какой  из шаблонов WordPress будет использовать для отображения страницы на вашем сайте, будет зависеть от того что вы используете дочернюю тему и иерархии шаблонов.

Предположим, вы просматриваете страницу архива категорий WordPress на своем сайте. WordPress будет использовать иерархию шаблонов, чтобы найти наиболее подходящий файл:

  • Файл шаблона архива категории для этой конкретной категории с использованием slug: category-wordpress.php
  • Файл шаблона архива категории для этой конкретной категории, используя идентификатор: category-123.php(например
  • Общий файл архива категории: category.php
  • Общий файл архива: archive.php
  • Oбщий index.php

WordPress будет искать их как в родительской, так и в дочерней теме. Когда он находит первый файл в иерархии, он будет использовать его, будь то в родительской теме или дочерней теме.

Есть одно исключение: когда наиболее подходящий файл шаблона имеет версию как в родительской, так и в дочерней темах, WP будет использовать файл из дочерней темы и игнорировать тот, который находится в родительской родительской теме. Это один из самых распространенных способов использования дочерней темы .

Вот несколько примеров использования файлов шаблонов:

  • Если у дочерней темы есть archive.php и index.php, а родительская тема имеет category.php и index.php, то WordPress будет использовать category.php из родительской темы, потому что она самая высокая в иерархии.
  • Если у дочерней темы есть archive.php и index.php, а у родительской темы есть archive.php и index.php, то будет использован будет файл archive.php из вашей дочерней темы.
  • Если у дочерней темы есть category.php и index.php, а у родительской темы есть archive.php и index.php, то будет использован файл category.php из дочерней темы, так как он имеет более высокую позицию в иерархии.

Поэтому, если нужно переопределить файл шаблона в родительской теме, создайте копию этого файла в дочерней теме и сделайте нужные изменения/дополнения.

Функции

Последний тип файлов, которые используют и дочерняя, и родительская темы – файлы, в которых содержатся  функций темы. Это также относится к функциям, которые вы добавляете к своим темам.

Функции из дочерней темы будут перевыполняться д функциями  из  родительской темы, при условии, что они прикреплены к одним и тем же фильтрам и событиям(хукам).  То  есть это работает не так как со  стилями и шаблонами и означает, что если вы не будете соблюдать осторожность, функции в родительской теме могут переопределить функции в  дочерней теме.

Важно отметить, что запись функции в дочерней теме с тем же именем, что и в родительской теме, может привести к ошибке. WordPress не нравится, когда две функции имеют одинаковое имя. Исключением является использование функции в дочерней теме для переопределения функции подключаемого модуля в родительской теме.

Подключаемые функции

Признаком подключаемой функции является то, что она “обернута” в проверку на использование функции с тем же именем. Другими словами, родительская тема проверяет, была ли запущена функция с тем же именем из дочерней темы. Если это так, то функция в родительской теме не запускается. Поэтому, если в родительской теме есть подключаемые функции, из можно легко переопределить их в дочерней теме.

Использование приоритета для запуска в первую очередь функций родительской темы

Когда мы говорим, что функции из  дочерней темы будут выполняться перед функциями родительской темы (при условии прикрепления к одному и тому же хуку), то предполагается, что приоритет не указан явно и  используется приоритет по умолчанию.

Приоритет – третий параметр функций add_action () и add_filter (). Чем выше число, которое вы используете для этого, тем позже будет срабатывать функция. Поэтому, если у хука есть четыре функции, прикрепленные к нему, с приоритетами 5, 10, 20 и 30, тогда они будут в срабатывать в порядке возрастания.

Если у функции нет приоритета, WordPress по умолчанию присваивает ей приоритет  10. Так что если в родительской теме есть функция, не имеющая приоритета, и вы хотите запустить другую функцию на том же самом хуке из дочерней темы, просто задайте ей приоритет выше 10.

Открепление функций

Если функция в родительской теме не подключаемая, но вы хотите написать переопределяющую функцию в дочерней теме, это можно сделать. Нужно открепить функцию от запускающего хука в  родительской теме – все, она не будет срабатывать. Затем в дочерней теме создаете функцию с другим именем,  и перехватите ее  тем же хуком.

 


Комментировать