Intereting Posts
Получать сообщения из нескольких налоговых условий Последняя функция Foursquare Checkin Как разрешить пользователям переключаться на дочернюю тему с внешнего интерфейса без плагина? WooCommerce: изменение страны по умолчанию на странице корзины Пользователь Meta stuff start_lvl игнорируется в пользовательском walker_nav_menu Создание формы регистрации пользователя WordPress Почему иногда я получаю строку идентификатора вложения вместо URL-адреса из заголовка изображения в таблице сообщений? Как я могу отобразить пользовательскую страницу в области администрирования WordPress? (получение сообщения «не разрешено для доступа к этой странице» Каков самый простой способ отключить многоузловое размещение одного из сайтов? Пользовательский тип сообщения «иерархическая» Справка! Jetpack: Показать название сайта, если нет логотипа сайта «Уведомление: неопределенный индекс:« ошибка при добавлении нового контента? Как хранить массив в usermeta в wordpress Ошибка cookie при первом попытке входа в систему

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'); 

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

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