Правильный способ подключения PHP файлов в WordPress
Я начинающий разработчик WordPress и недавно столкнулся с проблемами (на нескольких сайтах) при использовании include_once
и require_once
для PHP файлов. Если я подключаю файл через (get_theme_directory_uri() . 'subdir/file')
, указанный файл действительно подключается (или вызывает фатальную ошибку при require), но если внутри 'file' вызываются какие-либо функции WordPress, я получаю ошибку типа:
'Вызов неопределенной функции
add_action()
в /полный/путь/к/файлу'.
Кажущееся решение, которое я нашел - это использовать:
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';

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

С комментарием Rarst я понял, что мой ответ относится к плагинам, а не к темам. Для тем используйте get_template_directory() вместо get_template_directory_uri(). Просто!

В 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, и дочерняя тема может быть включена или нет.
- Используйте этот метод, если вы хотите подключить файл внутри темы и хотите гарантировать использование директории родительской темы, даже если включена дочерняя тема:
require get_template_directory() . '/vendor/autoload.php';
- Или используйте этот метод, если вы хотите подключить файл внутри темы и не важно, будет использоваться директория родительской темы или директория дочерней темы, если она включена:
require get_stylesheet_directory() . '/vendor/autoload.php';
- И наконец, используйте этот метод, если вы хотите подключить файл внутри плагина:
require __DIR__ . '/vendor/autoload.php';
Будьте осторожны с последним методом, потому что магическая константа __DIR__
будет иметь разное значение в зависимости от директории, в которой находится ваш PHP-файл.
Обратите внимание, что нет никакой пользы от использования функции plugin_dir_path()
, так как это всего лишь обёртка для функции trailingslashit()
.
Документация говорит:
Часть "plugin" в названии вводит в заблуждение — её можно использовать для любого файла, и она не вернёт директорию плагина, если вы не вызываете её в файле, находящемся в базовой директории плагина.
Подробнее см. https://developer.wordpress.org/reference/functions/plugin_dir_path/.
Также обратите внимание, что использование include
является плохой практикой, потому что отсутствующий файл вызовет только предупреждение. Всегда используйте require
, потому что отсутствующий файл вызовет фатальную ошибку и не останется незамеченным.
