Правильный способ подключения/требования PHP файлов в WordPress

Вопрос или проблема

Я новый разработчик WordPress и недавно у меня возникли проблемы (на нескольких сайтах) с include_once и require_once для PHP-файлов. Если я включаю (get_theme_directory_uri() . 'subdir/file'), указанный файл подключается (или требуется, что приводит к фатальным ошибкам), но если в ‘file’ вызываются какие-либо функции WordPress, я получаю что-то подобное:

Call to undefined function add_action() in /full/path/to/file’.

Очевидным решением, которое я нашел, является выполнить:

include(dirname(__FILE__) . "/subdir/filename");

Правильно ли это или я упустил “способ WordPress” для подключения файлов где-то?

Если вы проверите https://codex.wordpress.org/Function_Reference/get_template_directory_uri

Вы увидите, что get_template_directory_uri() возвращает URI, а не путь к серверу.

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

include get_template_directory() . '/subdir/filename.php';

Для плагина вы можете использовать функцию plugin_dir_path():

include plugin_dir_path( __FILE__ ) . '/subdir/filename.php';

WordPress 4.7+ вводит функции get_theme_file_path() для подключения файлов в темах WordPress.

Включайте так:

include get_theme_file_path( '/subdir/filename.php' );

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

Ссылка: https://developer.wordpress.org/reference/functions/get_theme_file_path/

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

  1. Используйте этот метод, если вы хотите подключить файл в теме и хотите гарантировать, что будет использована директория родительской темы, даже если включена дочерняя тема:
require get_template_directory() . '/vendor/autoload.php';
  1. Или используйте этот метод, если вы хотите подключить файл в теме и не против того, будет ли использоваться директория родительской темы или директория дочерней темы, если включена дочерняя тема:
require get_stylesheet_directory() . '/vendor/autoload.php';
  1. И наконец, используйте этот метод, если вы хотите подключить файл в плагине:
require __DIR__ . '/vendor/autoload.php';

Будьте осторожны с последним методом, потому что магическая константа __DIR__ будет иметь разное значение в зависимости от директории, в которой находится ваш php-файл.

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

Документация говорит:

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

Смотрите https://developer.wordpress.org/reference/functions/plugin_dir_path/ для получения более подробной информации.

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

.

Ответ или решение

Включение PHP-файлов в WordPress: лучший подход

Теория

Включение и подключение файлов в WordPress требует особого подхода, чтобы избежать ошибок и обеспечить корректную работу темы или плагина. Ошибка "Call to undefined function" часто возникает при неправильном использовании функций include_once или require_once, если загружаемые файлы содержат вызовы функций WordPress, которые к тому времени еще не были определены.

Пример

Рассмотрим, как правильно подключать файлы в контексте темы и плагина. Ошибки, которые указываете вы, как правило, возникают из-за некорректного указания пути. Функция get_theme_directory_uri() возвращает URL к директории темы, а не путь на сервере, что и вызывает ошибку. Вместо нее следует использовать:

  • get_template_directory() для получения пути к основной теме;
  • get_stylesheet_directory() для работы с дочерними темами;
  • plugin_dir_path(__FILE__) для плагинов.

Функции WordPress, такие как get_theme_file_path(), предоставляют дополнительные возможности: они учитывают дочерние темы, позволяя переопределять файлы основной темы. Пример использования:

include get_theme_file_path('/subdir/filename.php');

Для плагинов используйте:

require plugin_dir_path(__FILE__) . 'subdir/filename.php';

Применение

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

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

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

Оцените материал
Добавить комментарий

Капча загружается...