Статьи

Как включить и требовать файлы и шаблоны в WordPress

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

Для чего это стоит, я из последнего лагеря. Я думаю, что PHP в порядке. Как и все, это не без проблем, но мне нравится работать с ним достаточно хорошо, и я рассматриваю это как способ сделать работу по сравнению с каким-то языком «в небе» в течение некоторого времени утопии развития.

Дело в том, что одна из вещей, которые любят разработчики в PHP — его особенности и гибкость — это те вещи, которые часто сбивают нас с толку. Список длинный, но в мире WordPress одна из самых распространенных проблем — правильный способ включения внешних файлов.

PHP предлагает четыре (!) Способа сделать это, а WordPress даже предлагает свой вариант.

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


Вообще говоря, включение файлов с PHP относится к действию включения другого сценария в контекст сценария, над которым вы сейчас работаете.

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

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

Согласно руководству по PHP:

include () включит и оценит указанный файл. Если файл не найден, появится предупреждение PHP.

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

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

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

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

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

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

Например, скажем, что вы работаете над функцией и в середине этой функции вы собираетесь включить отдельный файл. Этот отдельный файл будет иметь доступ к переменным, определенным ранее в функции, в которую он включен.

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

Взято прямо из руководства по PHP:

include_once () будет выполнять то же поведение, что и include (), но не будет включать файл снова, если он уже был включен.

Очевидно, что не нужно тратить столько времени на обсуждение общих моментов include_once() , но есть несколько ключевых отличий между тем, как работает include_once() и тем, как работает include() .

Во-первых, в то время как include_once() работает в основном так же, как include() , он не позволит вам снова включить скрипт. Это означает, что если где-то еще в вашем проекте был включен внешний файл, это определенное место, в котором этот файл был включен.

Так в чем же преимущество? Помимо гарантии того, что сценарий включен только в одно место, он также гарантирует, что переменные и функции не обязательно будут переопределены. Напомним, что при использовании include() скрипты имеют доступ к функциям и переменным, которые определены над ними.

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


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

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

Как мы увидим, это именно тот случай.

Еще раз, прямо из руководства по PHP:

require () выполняет то же самое, что и include (), но выдает PHP-фатальную ошибку, если файл не найден.

Так что вот что нужно с require() : он будет выполнять то же действие, что и include() если импортировать внешний скрипт в контекст того, над которым вы работаете, но если ему не удается найти файл, он выбрасывает ошибка и полностью останавливает выполнение.

Это означает, что ваше приложение останавливается. С помощью include() вы получите предупреждение и попытаетесь продолжить работу.

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

Но все зависит от того, над чем вы работаете. Иногда простые предупреждения PHP — это нормально — например, забывание инициализировать индекс массива — в других случаях вам нужна ошибка.

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

Наконец, из руководства по PHP:

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

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


В дополнение к критическому размышлению над тем, какая функция лучше всего подходит для вашего проекта, вот два дополнительных практических правила, которые следует учитывать при работе с include() и require() :

  • require_once() лучше подходит для больших сайтов, так как на более низком уровне выполняет дополнительную работу, которая влияет на безопасность и производительность.
  • include_once() работает быстрее и обычно считается приемлемым для небольших сайтов

Достаточно просто, но как насчет вспомогательных функций WordPress?


Учитывая все вышесказанное, существуют более эффективные способы, чем использование include() и require() для включения шаблонов в ваши проекты WordPress.

Скажем, например, что у вас есть несколько файлов циклов — один для формата записи:

  • петля-standard.php
  • петля-image.php
  • петля-quote.php

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

В какой-то момент было приемлемо сделать что-то вроде этого:

1
include_once( ‘loop-standard.php’ );

Но это уже не лучшая практика.

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

Функция принимает два аргумента:

  • Первый аргумент — это шаблон для шаблона. В приведенном выше примере это будет « loop ».
  • Второй аргумент — это имя шаблона. В приведенном выше примере это будет « standard », « quote » или « image ».

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

1
2
3
4
5
if( ‘quote’ == get_post_format() ) {
 
    get_template_part( ‘loop’, ‘quote’ );
 
}

Или, предполагая, что вы назвали свои шаблоны в соответствии с типами форматов записей, вы можете сделать что-то еще чище:

1
get_template_part( ‘loop’, get_post_format() );

Чисто, верно?

Вы можете сделать это еще дальше. Допустим, вы абстрагировали свой код пагинации в собственный файл шаблона с именем pagination.php . Используя get_template_part() , вы можете включить это по всему сайту, скажем, в footer.php или в index.php , single.php , archives.php и т. Д., Просто добавив:

1
get_template_part( ‘pagination ‘);

Намного проще, не так ли?


Таким образом, после всего этого нам еще предстоит обсудить рекомендации о том, когда и что использовать. Я ни в коем случае не авторитет в этом, но вот правила, которым я следую:

  1. В разработке тем я всегда использую get_template_part() .
  2. В разработке плагинов я почти всегда использую include_once() и обычно использую его один раз в функции. Вы можете видеть это в моих шаблонах .
  3. Если плагин, который я пишу, будет использоваться на очень большом сайте, тогда я использую require_once() .

Это все!


Для более подробного объяснения того, что было описано в этой статье, обязательно прочитайте справочные страницы для каждой из функций: