В WordPress одна из распространенных проблемных ситуаций — это правильный способ включения внешних файлов.
PHP предлагает четыре (!) Способа сделать это, а WordPress даже предлагает свой вариант.
В этой статье мы рассмотрим эти способы, а также рекомендации по использованию каждого из них.
include()
Согласно руководству по PHP: include()
будет включать и оценивать указанный файл. Если файл не найден, будет выдано предупреждение PHP.
Проще говоря, это означает, что PHP будет искать файл, который вы пытаетесь включить. Если он найден, он будет добавлен в ваш скрипт в том месте, где вы его объявили.
Это важно понимать. Например, предположим, что вы пишете набор функций, которые зависят от предыдущего набора функций. В этом случае вам нужно убедиться, что сначала включен другой файл.
С другой стороны, если вы хотите добавить набор функций или внешний файл в середине существующей функции, вы можете включить его точно в то место, где он вам нужен.
Во-вторых, обратите внимание, что если файл отсутствует, PHP выдаст предупреждение. В зависимости от конфигурации сервера вы можете увидеть это в браузере или в файле записи журнала (или и то, и другое).
Тем не менее, предупреждения не считаются фатальными и обычно не останавливают выполнение функций, но их важно учитывать, потому что это может означать, что часть вашей работы не загружается и/или не интерпретируется должным образом.
Наконец, обратите внимание, что когда файл загружается с помощью include()
, он будет иметь доступ ко всем переменным, ранее определенным в вашем существующем скрипте.
Предположим, что вы работаете над функцией и на полпути к выполнению функции вы собираетесь включить отдельный файл. Этот отдельный файл будет иметь доступ к переменным, определенным ранее в функции, в которую он включен.
Хотя вы можете рассматривать это как удобство, это делает внешний сценарий немного неясным, поскольку он не обязательно показывает, что зависит от переменных, определенных извне. Это может сбивать с толку, особенно при работе в команде.
include_once()
Согласно руководству по PHP: include_once()
будет выполнять то же поведение, что и include()
, но не будет включать файл снова, если он уже был включен.
Функция include_once()
похожа на include()
, но между ними есть некоторые ключевые отличия.
Во-первых, в то время как include_once()
во многом работает так же, как include()
, она не позволит вам снова включить скрипт. Это означает, что если где-то еще в вашем проекте уже был включен этот внешний файл, второй раз он подключен не будет.
Так в чем преимущество этого? Помимо гарантии того, что скрипт находится только в одном месте, это также гарантирует, что переменные и функции не обязательно будут переопределены. Напомним, что при использовании include()
скрипты имеют доступ к функциям и переменным, которые определены перед ними.
Если вы решите определить новый набор переменных или функций в файле, то вы рискуете переопределить функции и переменные файла, подключенного через include()
, которые потенциально могут вызвать серьезные проблемы с выполнением вашего код.
require()
Согласно руководству по PHP: require()
работает так же, как include()
, но выдает фатальную ошибку PHP, если файл не найден.
Файл, подключенный с помощью require()
будет выполнять то же действие, что и include()
, в части импорта внешнего скрипта в контекст того, над чем вы работаете, но если ему не удается найти файл, он выдаст фатальную ошибка и полностью остановит выполнение.
На каком-то уровне может показаться, что требовать файлы — это правильный путь. В конце концов, зачем вам рисковать, включая что-то, чтобы получить предупреждение о потенциальном сбое в приложении.
Но все зависит от характера того, над чем вы работаете. Иногда можно использовать простые предупреждения PHP — например, забыть инициализировать индекс массива — в других случаях вам нужно точно знать, что файл подключен.
Не существует жестких правил, определяющих, когда использовать require()
, а когда include()
. Скорее всего тут нужно просто опираться на здравый смысл.
require_once()
Согласно руководству по PHP: require_once()
работает так же, как require()
, но не будет включать файл во второй раз, если он уже включен.
Это, вероятно, легче всего понять, поскольку мы рассмотрели последние три функции относительно подробно. Проще говоря, require_once()
выполняет те же функции, что и require()
, но не будет пытаться снова включить файл, если он уже загружен в ваш скрипт.
get_template_part()
WordPress предлагает функцию get_template_part()
, которая является частью собственного API и используется специально для повторного использования разделов или шаблонов кода в вашей теме.
get_template_part( 'loop', 'standard' );
Функция принимает два аргумента:
- Первый аргумент — это ярлык для шаблона. В приведенном примере это будет «loop».
- Второй аргумент — это имя шаблона. В приведенном выше примере это будет «standard».
С версии WordPress 5.5.0 принимает третий параметр — переменную, которую можно использовать, чтобы пробрасывать данные в шаблон, например:
get_template_part( 'loop', 'standard', [ 'bgcolor' => 'light-gray', 'areas' => [ 1, 2 ] ] );
Теперь в этом файле можно получить указанные параметры через переменную $args.
Когда-что использовать
При использовании этих функций я советую, в первую очередь, опираться на здравый смысл, а во вторую но чьи-то рекомендации, но если вы все же решите воспользоваться советами, то вот принципы, которые я использую чаще всего:
- При подключении файлов в functions.php чаще всего я использую
require_once()
- При подключении фронтенд-шаблонов в файлах темы использую
get_template_part()
- При разработке плагинов я почти всегда использую
include_once()
и обычно использую его один раз в функции