Cum să incluzi fișiere PHP în plugin-uri în mod corect

21 ian. 2011, 03:48:41
Vizualizări: 185K
Voturi: 81

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?
6
Comentarii

faci ceva greșit dacă primești acel mesaj. Asigură-te că incluzi orice fișiere înainte de a începe să rulezi funcții din aceste fișiere

onetrickpony onetrickpony
21 ian. 2011 04:55:31

nu e asta, apelurile sunt în fișierele pe care le includ!

Bainternet Bainternet
21 ian. 2011 05:06:44

lol, acum văd WP_PLUGIN_URL în codul tău de mai sus :)

onetrickpony onetrickpony
21 ian. 2011 06:04:54

Foarte simplu spus, poți include() fișiere doar prin calea fișierului și nu printr-un URI.

editor editor
21 ian. 2011 07:25:25

Acest articol din Codex (probabil scris după ce ai pus întrebarea) este destul de util: http://codex.wordpress.org/Determining_Plugin_and_Content_Directories

henrywright henrywright
12 mar. 2014 12:52:12

Faci asta într-un fișier PHP care este folosit ca punct final AJAX sau ca handler de formular? Nu ar trebui niciodată să faci apeluri directe către fișiere PHP în interiorul temelor sau pluginurilor WordPress. De asemenea, includerea URL-urilor nu funcționează, dacă ar funcționa ai avea o problemă majoră de securitate și performanță slabă

Tom J Nowell Tom J Nowell
13 mai 2016 19:58:46
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 9
2
109

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.

25 oct. 2011 01:19:04
Comentarii

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.

squarecandy squarecandy
30 ian. 2018 22:30:40

Alternativa - dacă AVEȚI NEVOIE de căi relative, este require_once(plugin_dir_path(__DIR__).'/myfile.inc');

paulsm4 paulsm4
4 oct. 2019 23:28:09
1
10

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";
21 ian. 2011 12:40:55
Comentarii

includerile relative pot aduce tot felul de probleme neașteptate neplăcute.

Mark Kaplun Mark Kaplun
1 dec. 2017 09:47:29
0

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).

21 ian. 2011 05:29:35
1

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ă.

21 ian. 2011 05:34:04
Comentarii

Așa cum spune @mtekk, aș recomanda să folosești această structură:

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

Webord Webord
21 ian. 2011 05:35:48
1

Î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!

21 ian. 2011 06:00:37
Comentarii

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

I am the Most Stupid Person I am the Most Stupid Person
18 sept. 2017 13:28:05
0
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');
13 mai 2016 19:35:20
0

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?

21 ian. 2011 05:46:32
1

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/

29 mai 2014 07:56:52
Comentarii

Te rog să adaugi informații relevante din linkul furnizat în răspunsul tău. Folosește linkul pentru scopuri de atribuire. Te rog să [editezi] întrebarea ta

Pieter Goosen Pieter Goosen
29 mai 2014 08:48:10
0

De asemenea, poate funcționa:

include WP_PLUGIN_DIR . '/plugin-name/ipn/paypal-ipn.php';

25 mar. 2022 18:29:41