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

59

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

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

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

add_action('hook', 'callback');

и я получаю:

Неустранимая ошибка: вызов неопределенной функции add_action ()

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

Вопросы:

  • Каков будет правильный способ сделать это?
  • Какие различия между include, include_once, requireи когда я могу использовать ведьму?
Bainternet
источник
вы делаете что-то не так, если получаете это сообщение. Убедитесь, что вы включили любые файлы, прежде чем запускать функции из этих файлов
onetrickpony
это не так, звонки в файлах, которые я в том числе!
Bainternet
LOL, теперь я вижу WP_PLUGIN_URLв вашем коде выше :)
onetrickpony
3
Проще говоря, вы можете включать () файлы только через путь к файлу, а не через URI.
редактор
1
Эта статья Кодекса (вероятно, написанная после того, как вы задали свой вопрос) весьма полезна: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

Ответы:

88

Приходите поздно на эту вечеринку, но вот способ «WordPress»: используйте plugin_dir_path( __FILE__ ), например:

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

Обратите внимание , что функция делает вернуть слэш для FilePath.

Чип Беннетт
источник
3
Обратите внимание, что при использовании __FILE__он будет выводить данные относительно текущего файла, из которого вы его вызываете, поэтому, если ваш includeоператор сделан из подкаталога в структуре вашего файла плагина, вы также получите подкаталог обратно.
SquareCandy
Альтернатива - если вам НУЖНЫ относительные пути,require_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay
10

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

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

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

Пример кода:

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

Просто прямо включить или требовать

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

Пример кода:

include "classes/plugin-core.php";
Дуэйн Чаррингтон
источник
Относительный включает может принести все виды неприятных неожиданных проблем.
Марк Каплун
5

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

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

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

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

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

mtekk
источник
5

Во-первых, спасибо всем, кто ответил,

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

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

Я читал о поддержке WordPress . и еще раз спасибо за ответ!

Bainternet
источник
Не могли бы вы еще раз пометить этот ответ ( wordpress.stackexchange.com/a/32002/123092 ) как принятый?
Я самый глупый человек
4

Включают

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

Включить один раз

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

требовать

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

Требовать один раз

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

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

Webord
источник
Как говорит @mtekk, я бы рекомендовал вам использовать такую ​​структуру: require_once (dirname ( FILE ). '/Filename.php);
Webord
1

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

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

Кого вы получаете, чтобы ваш «плагин» загружался? Вы используете include*()или, require*()чтобы загрузить его, может быть, в вашем wp-config.phpфайле?

MikeSchinkel
источник
1
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');
Аамер Шахзад
источник
0

Всякий раз, когда вы создаете новый файл в вашем рабочем каталоге, вы должны включать его каждый раз. Но попробуйте метод сканирования вашего directroy и автоматического прикрепления его, а не только файлов php, который помогает правильно включать файлы php, js и css с обеих сторон (бэкэнд, передний конец).

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

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