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


Моя проблема заключается в том, что в основной файл плагина я включаю файл 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 и когда я использую ведьму?
Author: Sven, 2011-01-21

8 answers

Опаздываю на эту вечеринку, но вот способ "WordPress": используйте plugin_dir_path( __FILE__ ), например:

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

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

 96
Author: Chip Bennett, 2011-10-24 22:19:04

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

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

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

Пример кода:

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

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

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

Пример кода:

include "classes/plugin-core.php";
 10
Author: Dwayne Charrington, 2011-01-21 10:40:55

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

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

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

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

 6
Author: Bainternet, 2011-01-21 04:00:37

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

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

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

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

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

 5
Author: mtekk, 2011-01-21 03:29:35

Включать

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

Включать Один Раз

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

Требовать

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

Требуется Один Раз

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

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

 5
Author: Webord, 2011-01-21 03:34:04

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

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

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

 1
Author: MikeSchinkel, 2011-01-21 03:46:32
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');

Примечание: для файлов enqueu.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');
 1
Author: Aamer Shahzad, 2016-05-13 16:35:20

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

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

 0
Author: varadha, 2014-05-29 04:56:52