Cum să incluzi fișiere PHP în plugin-uri în mod corect
Problema mea este când în fișierul principal al plugin-ului includ un fișier PHP în acest fel:
include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// sau
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// sau
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// sau
require_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
și în acel fișier am un apel către o funcție WordPress precum:
add_action('hook', 'callback');
și primesc:
Fatal Error: Call to undefined function add_action()
Înainte să spuneți "folosește if(**function_exists**('add_action')){
", dacă folosesc asta atunci pur și simplu nu funcționează.
Întrebările:
- Care ar fi modul corect de a face asta?
- Care sunt diferențele dintre
include
,include_once
,require
și când folosesc pe care?

Ajungând mai târziu la această petrecere, dar iată metoda "WordPress": folosește plugin_dir_path( __FILE__ )
, de exemplu:
<?php
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
?>
Reține că funcția returnează slash-ul final pentru calea fișierului.

Rețineți că prin utilizarea __FILE__
va returna calea relativă față de fișierul curent din care îl apelați, așadar dacă instrucțiunea include
este executată dintr-un subdirector în structura fișierelor plugin-ului, veți primi și calea subdirectorului.

Am analizat câteva plugin-uri pe care le-am creat anterior pentru a vedea diferitele metode pe care le-am folosit pentru a include fișiere suplimentare în interiorul plugin-urilor și am observat că există două metode pe care le poți utiliza, probabil există și altele.
Definirea directorului plugin-ului
În interiorul plugin-ului tău, poți avea următoarea definiție pentru a specifica locația curentă a plugin-ului.
Exemplu de cod:
define( 'PLUGIN_DIR', dirname(__FILE__).'/' );
Simplu folosind include sau require
Poți folosi simplu: include, include_once, require sau require_once în interiorul folderului plugin-ului tău, referindu-te la locație ca în exemplul de cod de mai jos. Exemplul de mai jos se bazează pe un fișier din directorul rădăcină al plugin-ului care include un alt fișier dintr-un folder din interiorul directorului plugin-ului.
Exemplu de cod:
include "classes/plugin-core.php";

Am renunțat la construcțiile specifice WordPress pentru includeri și folosesc următoarea abordare:
require_once(dirname(__FILE__) . '/filename.php');
Nu cred că va rezolva efectiv problema ta, care pare să fie una de domeniu (scope), dar este codul pe care îl folosesc eu.
În ceea ce privește diferența dintre include și require:
include va arunca un avertisment dacă fișierul nu este găsit
require va arunca o eroare fatală dacă fișierul nu este găsit
include_once și require_once nu vor include/necesita fișierul/codul din nou dacă a fost deja inclus/necesitat (rețineți că, din câte am observat, acest lucru se aplică doar pentru un anumit fișier într-un anumit director).

Include
Funcția include() include și evaluează fișierul specificat.
Include Once
Funcția include_once() include și evaluează fișierul specificat în timpul execuției scriptului. Acest comportament este similar cu include(), cu singura diferență că dacă codul dintr-un fișier a fost deja inclus, acesta nu va fi inclus din nou. După cum sugerează și numele, va fi inclus o singură dată.
Require
Funcțiile require() și include() sunt identice în toate privințele, cu excepția modului în care gestionează erorile. Ambele produc un Warning, dar require() rezultă într-o Eroare Fatală. Cu alte cuvinte, nu ezitați să folosiți require() dacă doriți ca absența unui fișier să oprească procesarea paginii.
Require Once
Funcția require_once() include și evaluează fișierul specificat în timpul execuției scriptului. Acest comportament este similar cu require(), cu singura diferență că dacă codul dintr-un fișier a fost deja inclus, acesta nu va fi inclus din nou.
Informația de mai sus este din documentația PHP, ideea este că nu există o variantă corectă universală, ci depinde de nevoile codului. Eu folosesc require() pentru elemente importante precum funcții, dar pentru fișiere de temă precum footer sau loop folosesc include_once sau include, deoarece pot gestiona warning-ul și pot informa utilizatorul/ vizitatorul că a apărut o eroare, în loc să afișez direct o eroare fatală.

În primul rând, mulțumesc tuturor celor care au răspuns,
Problema mea a fost apelarea fișierelor incluse cu URL-ul complet, astfel încât ele nu treceau prin WordPress. Și asta s-a întâmplat pentru că, așa cum am menționat în întrebare, le apelam din fișierul principal al plugin-ului. Deci soluția a fost să folosesc:
include_once('/ipn/paypal-ipn.php');
Am citit despre asta pe suportul WordPress. Și din nou, mulțumesc pentru răspunsuri!

Poți să reconsideri marcarea acestui răspuns (https://wordpress.stackexchange.com/a/32002/123092) ca fiind cel acceptat?

include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
sau
define( 'PLUGIN_ROOT_DIR', plugin_dir_path( __FILE__ ) );
include( PLUGIN_ROOT_DIR . 'ipn/paypal-ipn.php');
sau
$plugin_dir_path = plugin_dir_path( __FILE__ );
include( $plugin_dir_path . 'ipn/paypal-ipn.php');
Notă: pentru a încărca fișiere .css & .js cu admin_enqueue_scripts
în interiorul plugin-ului, folosiți plugin_dir_url( __FILE__ )
$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');

Salut @בניית אתרים:
Când WordPress se încarcă, definește funcția add_action()
înainte de a încerca să încarce orice plugin. Faptul că primești această eroare îmi spune că faci ceva neobișnuit sau că ceva nu este în regulă cu instalarea ta de WordPress.
Cum încerci să încarci "pluginul" tău? Folosești include*()
sau require*()
pentru a-l încărca, poate în fișierul tău wp-config.php
?

Ori de câte ori creezi un fișier nou în directorul tău de lucru, trebuie să îl incluzi de fiecare dată. Dar încearcă o metodă care să scaneze automat directorul și să atașeze fișierele, nu doar cele php, ceea ce ajută la includerea corectă a fișierelor php, js și css atât pe partea de backend, cât și pe frontend.
http://kvcodes.com/2014/05/wordpress-theme-development-include-files-automatically/
