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

27 окт. 2015 г., 13:44:35
Просмотры: 96.1K
Голосов: 14

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

'Вызов неопределенной функции add_action() в /полный/путь/к/файлу'.

Кажущееся решение, которое я нашел - это использовать:

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

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

1
Комментарии

Пожалуйста, взгляните на ссылки, они могут быть полезными: http://wordpress.stackexchange.com/questions/111628/include-a-external-php-file-into-a-wordpress-custom-template

http://wordpress.stackexchange.com/questions/7398/how-to-include-php-files-in-plugins-the-correct-way

jas jas
27 окт. 2015 г. 13:55:18
Все ответы на вопрос 3
4
25

Если вы посмотрите 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';
27 окт. 2015 г. 19:39:26
Комментарии

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

Rarst Rarst
27 окт. 2015 г. 19:46:51

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

thomascharbit thomascharbit
27 окт. 2015 г. 19:58:09

может, стоит попробовать - /subdir/filename.php?

Jon Jon
15 апр. 2019 г. 11:53:48

@Jon спасибо, аналогичное наблюдение. Отправил правку к ответу.

kontur kontur
16 февр. 2023 г. 14:44:47
2
19

В 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/

14 мая 2019 г. 12:09:51
Комментарии

Именно то, что я искал! Теперь это должен быть правильный ответ.

Oneezy Oneezy
23 авг. 2019 г. 16:04:02

Точно, WP обновил хелпер для этого, это правильный ответ.

Maxime Culea Maxime Culea
16 сент. 2020 г. 19:24:55
0

В следующих примерах я предполагаю, что вы используете 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().

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

Часть "plugin" в названии вводит в заблуждение — её можно использовать для любого файла, и она не вернёт директорию плагина, если вы не вызываете её в файле, находящемся в базовой директории плагина.

Подробнее см. https://developer.wordpress.org/reference/functions/plugin_dir_path/.

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

23 дек. 2022 г. 22:49:51