Как правильно подключать PHP файлы в плагинах WordPress

21 янв. 2011 г., 03:48:41
Просмотры: 185K
Голосов: 81

Моя проблема в том, что когда в основном файле плагина я подключаю PHP файл примерно так:

include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// или
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// или
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// или
require_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');

и в этом файле у меня есть вызов функции WordPress:

add_action('hook', 'callback');

я получаю:

Fatal Error: Call to undefined function add_action()

И прежде чем вы скажете "используйте if(**function_exists**('add_action')){", если я использую это, то просто не работает.

Вопросы:

  • Какой правильный способ это сделать?
  • В чем разница между include, include_once, require и когда что использовать?
6
Комментарии

если вы получаете это сообщение, значит, вы делаете что-то не так. Убедитесь, что вы подключаете все файлы до того, как начнёте использовать функции из этих файлов

onetrickpony onetrickpony
21 янв. 2011 г. 04:55:31

нет, дело не в этом, вызовы находятся внутри файлов, которые я подключаю!

Bainternet Bainternet
21 янв. 2011 г. 05:06:44

лол, теперь я вижу WP_PLUGIN_URL в вашем коде выше :)

onetrickpony onetrickpony
21 янв. 2011 г. 06:04:54

Проще говоря, вы можете включать файлы только через путь к файлу, а не через URI.

editor editor
21 янв. 2011 г. 07:25:25

Эта статья из Codex (вероятно, написанная после вашего вопроса) может быть полезной: http://codex.wordpress.org/Determining_Plugin_and_Content_Directories

henrywright henrywright
12 мар. 2014 г. 12:52:12

Вы делаете это в PHP-файле, который используется как AJAX-эндпоинт или обработчик формы? Вы никогда не должны делать прямые вызовы к PHP-файлам внутри тем или плагинов WordPress. Кроме того, включение URL-адресов не работает — если бы это работало, у вас была бы огромная проблема с безопасностью и ужасная производительность.

Tom J Nowell Tom J Nowell
13 мая 2016 г. 19:58:46
Показать остальные 1 комментариев
Все ответы на вопрос 9
2
109

Присоединяюсь к обсуждению с опозданием, но вот "WordPress"-способ: используйте plugin_dir_path( __FILE__ ), например:

<?php
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
?>

Обратите внимание, что функция возвращает путь с завершающим слешем.

25 окт. 2011 г. 01:19:04
Комментарии

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

squarecandy squarecandy
30 янв. 2018 г. 22:30:40

Альтернатива - если вам НЕОБХОДИМЫ относительные пути, это require_once(plugin_dir_path(__DIR__).'/myfile.inc');

paulsm4 paulsm4
4 окт. 2019 г. 23:28:09
1
10

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

Определение директории плагина

Внутри вашего плагина можно использовать следующее определение для указания текущего местоположения плагина.

Пример кода:

define( 'PLUGIN_DIR', dirname(__FILE__).'/' );  

Прямое подключение через include или require

Вы можете просто использовать функции: include, include_once, require или require_once внутри папки плагина, указывая путь к файлу, как в примере ниже. В этом примере файл из корневой директории плагина подключает другой файл из папки внутри директории плагина.

Пример кода:

include "classes/plugin-core.php";
21 янв. 2011 г. 12:40:55
Комментарии

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

Mark Kaplun Mark Kaplun
1 дек. 2017 г. 09:47:29
0

В итоге я отказался от конструкций WordPress для подключения файлов и использую следующее:

require_once(dirname(__FILE__) . '/filename.php');

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

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

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

21 янв. 2011 г. 05:29:35
1

Include

Функция include() включает и выполняет указанный файл.

Include Once

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

Require

Функции require() и include() идентичны во всем, кроме реакции на ошибки. Обе генерируют Warning, но require() приводит к Fatal Error. Другими словами, используйте require(), если отсутствие файла должно остановить обработку страницы.

Require Once

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

Вышеуказанная информация взята из документации PHP. Дело в том, что нет "правильного" варианта - выбор зависит от потребностей кода. Я использую require() для важных вещей, таких как функции, но для файлов темы, таких как подвал (footer) или цикл (loop), я применяю include_once или include, потому что могу обработать предупреждение и сообщить пользователю/посетителю о произошедшей ошибке, а не просто выдать fatal_error.

21 янв. 2011 г. 05:34:04
Комментарии

Как сказал @mtekk, я бы рекомендовал использовать такую структуру:

require_once(dirname(FILE) . '/filename.php);

Webord Webord
21 янв. 2011 г. 05:35:48
1

В первую очередь, спасибо всем, кто ответил,

Моя проблема заключалась в подключении включаемых файлов с использованием полного URL, из-за чего они не проходили через WordPress. Это произошло потому, что, как я указал в вопросе, я вызывал их из основного файла плагина. Решением стало использование:

include_once('/ipn/paypal-ipn.php');

Я прочитал об этом в поддержке WordPress. И снова спасибо за ответы!

21 янв. 2011 г. 06:00:37
Комментарии

Не могли бы вы пересмотреть решение и отметить этот ответ (https://wordpress.stackexchange.com/a/32002/123092) как принятый?

I am the Most Stupid Person I am the Most Stupid Person
18 сент. 2017 г. 13:28:05
0
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

или

define( 'PLUGIN_ROOT_DIR', plugin_dir_path( __FILE__ ) );
include( PLUGIN_ROOT_DIR . 'ipn/paypal-ipn.php');

или

$plugin_dir_path = plugin_dir_path( __FILE__ );
include( $plugin_dir_path . 'ipn/paypal-ipn.php');

Примечание: для подключения .css и .js файлов через admin_enqueue_scripts внутри плагина используйте plugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');
13 мая 2016 г. 19:35:20
0

Привет @בניית אתרים:

При загрузке WordPress определяет функцию add_action() до попытки загрузки любых плагинов. Тот факт, что вы получаете ошибку, говорит мне, что вы делаете что-то странное или что-то не так с вашей установкой WordPress.

Как вы загружаете свой "плагин"? Используете ли вы include*() или require*() для его загрузки, возможно, в файле wp-config.php?

21 янв. 2011 г. 05:46:32
1

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

http://kvcodes.com/2014/05/wordpress-theme-development-include-files-automatically/

29 мая 2014 г. 07:56:52
Комментарии

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

Pieter Goosen Pieter Goosen
29 мая 2014 г. 08:48:10
0

Это также может сработать:

include WP_PLUGIN_DIR . '/plugin-name/ipn/paypal-ipn.php';

25 мар. 2022 г. 18:29:41