Как правильно включать 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
и когда я использую ведьму?
8 answers
Опаздываю на эту вечеринку, но вот способ "WordPress": используйте plugin_dir_path( __FILE__ )
, например:
<?php
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
?>
Обратите внимание, что функция действительно возвращает завершающую косую черту для пути к файлу.
Я просмотрел пару плагинов, которые я ранее создал, чтобы увидеть различные способы включения дополнительных файлов внутри плагинов, и я заметил, что вы можете использовать два метода, возможно, их больше.
Определите свой каталог плагинов
Внутри вашего плагина есть следующее определение для определения текущего местоположения плагина.
Пример кода:
define( 'PLUGIN_DIR', dirname(__FILE__).'/' );
Просто прямое включение или требование
Вы можете просто использовать; включите, include_once, require или require_once в папку вашего плагина, указав местоположение, как в приведенном ниже примере кода. Приведенный ниже пример будет основан на файле в вашем корневом каталоге плагинов, включая другой файл из папки внутри вашей папки плагинов.
Пример кода:
include "classes/plugin-core.php";
Во-первых, спасибо всем, кто ответил,
Моя проблема заключалась в вызове включенных файлов с полным URL-адресом, чтобы они не проходили через WordPress. и это произошло потому, что, как я уже говорил по этому вопросу, я вызывал их из основного файла плагина. таким образом, исправление закончилось использованием:
include_once('/ipn/paypal-ipn.php');
Я читал о поддержке WordPress . и еще раз спасибо за ответ!
В конечном итоге я отказываюсь от конструкций WordPress для includes и использую следующее:
require_once(dirname(__FILE__) . '/filename.php);
Я не думаю, что это действительно решит вашу проблему, которая, похоже, связана с областью применения, но это код, который я использую.
Что касается разницы между include и require:
include выдаст предупреждение , если файл не найден
require выдаст фатальную ошибку, если файл не найден
Include_once и require_once не будут включать/требовать файл/код снова, если он уже был включен/необходим (обратите внимание, что, насколько я могу судить, это только для определенного файла в определенном каталоге).
Включать
Инструкция include() включает и оценивает указанный файл.
Включать Один Раз
Оператор include_once() включает и оценивает указанный файл во время выполнения сценария. Это поведение аналогично оператору include(), с той лишь разницей, что если код из файла уже был включен, он не будет включен снова. Как следует из названия, это будет быть включенным только один раз.
Требовать
Require() и include() идентичны во всех отношениях, за исключением того, как они обрабатывают сбой. Они оба производят Предупреждение, но require() приводит к фатальная ошибка. Другими словами, не стесняйтесь использовать require(), если вы хотите , чтобы отсутствующий файл остановил обработку страницы.
Требуется Один Раз
Оператор require_once() включает и оценивает указанный файл во время выполнения скрипт. Это поведение аналогично оператору require(), с той лишь разницей, что если код из файла уже был включен, он не будет включен снова.
Приведенная выше информация взята из документации PHP, дело в том, что она не является правильной, будет зависеть от необходимости кода, мне действительно требуется() для важных вещей, таких как функции, но для файлов тем, таких как нижний колонтитул или цикл, который я использую include_once или include, потому что я могу обработать предупреждение и сказать пользователь/посетитель, у которого произошла ошибка, а не просто фатальная ошибка
Привет @בניית אתרים:
Когда WordPress загружается, он определяет функцию add_action()
перед попыткой загрузить какие-либо плагины Тот факт, что вы получаете ошибку, говорит мне, что вы делаете что-то странное или что что-то не так с вашей установкой WordPress.
Кого вы хотите загрузить своим "плагином" ? Вы используете include*()
или require*()
для загрузки, возможно, в свой файл wp-config.php
?
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');
Всякий раз, когда вы создаете новый файл в своем рабочем каталоге, вы должны включать его каждый раз. Но попробуйте метод сканирования вашего directroy и прикрепите его автоматически, а не только файлы php, что поможет правильно включить файлы php, js и css с обеих сторон (серверная часть, внешний интерфейс).
Http://kvcodes.com/2014/05/wordpress-theme-development-include-files-automatically/