get_stylesheet_directory () vs get_template_directory () для дочерней темы

Предположим, у меня есть следующий файл в моей родительской папке темы: 'theme-folder/inc/custom.php'

Затем я создал дочернюю тему.

Как я могу проверить, существует ли этот файл в дочерней теме, а затем извлечь его, в противном случае извлечь его из родительской темы?

get_template_directory() всегда извлекает файл из родительской темы.

Хотя get_stylesheet_directory() требует наличия файла в дочерней теме.

Solutions Collecting From Web of "get_stylesheet_directory () vs get_template_directory () для дочерней темы"

locate_template попытается найти указанный файл в дочерней теме и вернуться к родительской теме, если она не существует:

 locate_template('inc/custom.php', true); 

Установка второго параметра в значение true заставляет его требовать файл вместо простого определения пути.

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

 function load_theme_file($path) { if ( file_exists( STYLESHEETPATH . '/' . $path )) { include( STYLESHEETPATH . '/' . $path ); } else { require( TEMPLATEPATH . '/' . $path ); } } 

Применение:

 load_theme_file('inc/custom.php'); 

Редактировать: я просто хотел бы кратко рассказать о потенциальных проблемах с этим общим подходом.

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

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

Лучшим решением, на мой взгляд, является использование объектно-ориентированного подхода. Разрешить дочерней теме расширять классы, которые вы определяете, а затем использовать класс дочерней темы. В реализующих классах дочерняя тема должна была бы только определять методы, которые необходимо переписать. В родительской теме вы можете указать, какие методы не должны быть перезаписаны, сделав их final .

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

get_template_part() сделает это, если я пойму ваш вопрос.

 get_template_part('inc/custom'); 

Это похоже на то, чтобы сделать это, если я правильно читаю:

Легко позволяет теме повторно использовать разделы кода и простой способ для дочерних тем заменять разделы своей родительской темы.