Як правильно включити 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');

і я отримую:

Фатальна помилка: виклик до не визначеного додавання функції ()

Тепер перед тим, як сказати "використовувати if(**function_exists**('add_action')){", якщо я використовую це, то це просто не працює.

Питання:

  • Який би був правильний спосіб зробити це?
  • Які відмінності між include, include_once, requireі коли я можу використовувати відьму?

ви робите щось не так, якщо отримуєте це повідомлення. Переконайтеся, що ви включили будь-які файли, перш ніж запускати функції з цих файлів
onetrickpony

це ні, дзвінки входять до файлів, які я включаю!
Бейнтернет

хаха, тепер я бачу WP_PLUGIN_URLу вашому коді вище :)
onetrickpony

3
Простіше кажучи, ви можете включати () файли лише через файлову систему, а не URI.
редактор

1
Ця стаття про Codex (напевно, написана після того, як ви задали своє запитання) є дуже корисною: 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_once, вимагати або Requ_once всередині папки плагінів, посилаючись на розташування, як у наведеному нижче коді прикладу. Наведений нижче приклад буде заснований на файлі у вашій кореневій директорії плагінів, включаючи інший файл із папки всередині папки плагінів.

Приклад коду:

include "classes/plugin-core.php";

родич включає може принести всі види неприємних несподіваних питань.
Марк Каплун

5

Я закінчую передачу конструкцій WordPress для включає і використовую наступне:

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

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

Що стосується різниці між включати і вимагати:
include буде виносити попередження, якщо файл не знайдено
вимагає, викличе фатальну помилку, якщо файл не знайдений

include_once і requ_once не включатимуть / вимагатимуть файлу / коду ще раз, якщо він уже включений / необхідний (зауважте, що, наскільки я можу сказати, це стосується лише конкретного файлу в конкретному каталозі).


5

По-перше, дякую всім, хто відповів:

Моєю проблемою було викликати включені файли з повною URL-адресою, щоб вони не проходили через WordPress. і це сталося тому, що, як я заявляв у запитанні, я викликав їх із головного файла плагінів. тому виправлення закінчилося за допомогою:

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

я читав про підтримку WordPress . і ще раз дякую за відповідь!


Чи можете ви переглянути, щоб позначити цю відповідь ( wordpress.stackexchange.com/a/32002/123092 ) як прийняту?
Я найдурніша людина

4

Включати

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

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

Оператор include_once () включає та оцінює вказаний файл під час виконання сценарію. Це поведінка, схожа на оператор include (), з тією лише різницею, що якщо код з файлу вже включений, він більше не буде включений. Як випливає з назви, воно буде включено лише один раз.

Вимагають

вимагають () і включають () є однаковими в усіх відношеннях, за винятком того, як вони справляються з відмовою. Вони обидва створюють попередження, але вимагають () результатів, які мають фатальну помилку. Іншими словами, не соромтеся використовувати, якщо потрібно (), якщо файл, що відсутній, зупинить обробку сторінки.

Потрібно один раз

Оператор Requ_once () включає та оцінює вказаний файл під час виконання сценарію. Це поведінка, схожа на оператор requ (), з тією лише різницею, що якщо код з файлу вже включений, він більше не буде включений.

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


Як кажуть @mtekk, я рекомендую вам використовувати структуру tis: requ_once (dirname ( FILE ). '/Filename.php);
Вебкор

1

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

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

На кого ви завантажуєте свій «плагін» ? Ви використовуєте include*()або require*()завантажуєте його, можливо, у своєму wp-config.phpфайлі?


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');

Примітка: для 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');

0

Щоразу, коли ви створюєте новий файл у своєму робочому каталозі, його потрібно включати кожного разу. Але спробуйте метод відсканувати вашу дирекцію та приєднати її автоматично, а не лише файли php, що допомагає правильно включати файли php, js та css з обох сторін (бекенд, передній кінець).

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


1
Будь ласка, додайте відповідну інформацію за посиланням, наданим до вашої відповіді. Використовуйте посилання для кредитних цілей. Будь ласка , змініть ваше запитання
Пітер Гусний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.