Come includere correttamente i file PHP nei plugin

21 gen 2011, 03:48:41
Visualizzazioni: 185K
Voti: 81

Il mio problema si verifica quando nel file principale del plugin includo un file PHP in questo modo:

include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// oppure
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// oppure
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// oppure
require_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');

e in quel file ho una chiamata a una funzione WordPress come:

add_action('hook', 'callback');

e ottengo:

Fatal Error: Call to undefined function add_action()

Prima che tu dica "usa if(**function_exists**('add_action')){", se uso quello semplicemente non funziona.

Le domande:

  • Qual è il modo corretto per farlo?
  • Quali sono le differenze tra include, include_once, require e quando devo usare quale?
6
Commenti

stai facendo qualcosa di sbagliato se ottieni quel messaggio. Assicurati di includere qualsiasi file prima di iniziare a eseguire funzioni da questi file

onetrickpony onetrickpony
21 gen 2011 04:55:31

non è quello, le chiamate sono all'interno dei file che sto includendo!

Bainternet Bainternet
21 gen 2011 05:06:44

lol, ora vedo WP_PLUGIN_URL nel tuo codice qui sopra :)

onetrickpony onetrickpony
21 gen 2011 06:04:54

Per dirla in modo molto semplice, puoi includere file solo tramite un percorso del file e non tramite un URI.

editor editor
21 gen 2011 07:25:25

Questo articolo del Codex (probabilmente scritto dopo che hai posto la tua domanda) è piuttosto utile: http://codex.wordpress.org/Determining_Plugin_and_Content_Directories

henrywright henrywright
12 mar 2014 12:52:12

Stai facendo questo in un file PHP che viene utilizzato come endpoint AJAX o come gestore di form? Non dovresti mai fare chiamate dirette a file PHP all'interno di temi o plugin di WordPress. Inoltre, includere URL non funziona, se funzionasse avresti un enorme problema di sicurezza e prestazioni terribili

Tom J Nowell Tom J Nowell
13 mag 2016 19:58:46
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 9
2
109

Arrivo in ritardo a questa festa, ma ecco il modo "WordPress": usa plugin_dir_path( __FILE__ ), ad esempio:

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

Nota che la funzione restituisce effettivamente lo slash finale per il percorso del file.

25 ott 2011 01:19:04
Commenti

Nota che usando __FILE__ restituirà il percorso relativo al file corrente da cui lo chiami, quindi se la tua dichiarazione include viene fatta da una sottodirectory all'interno della struttura dei file del tuo plugin, otterrai anche la sottodirectory.

squarecandy squarecandy
30 gen 2018 22:30:40

L'alternativa - se hai BISOGNO di percorsi relativi, è require_once(plugin_dir_path(__DIR__).'/myfile.inc');

paulsm4 paulsm4
4 ott 2019 23:28:09
1
10

Ho esaminato un paio di plugin che ho creato in precedenza per vedere i diversi modi in cui ho incluso file aggiuntivi all'interno dei plugin e ho notato che ci sono due metodi che puoi utilizzare, probabilmente ce ne sono altri.

Definisci la directory del tuo plugin

All'interno del tuo plugin, utilizza la seguente definizione per specificare la posizione corrente del plugin.

Codice di esempio:

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

Un semplice include o require

Puoi semplicemente usare: include, include_once, require o require_ once all'interno della cartella del tuo plugin facendo riferimento alla posizione come nell'esempio di codice qui sotto. L'esempio seguente si basa su un file nella directory principale del plugin che include un altro file da una cartella all'interno della directory del plugin.

Codice di esempio:

include "classes/plugin-core.php";
21 gen 2011 12:40:55
Commenti

gli include relativi possono causare ogni tipo di problema imprevisto e spiacevole.

Mark Kaplun Mark Kaplun
1 dic 2017 09:47:29
0

Alla fine ho rinunciato ai costrutti di WordPress per gli include e uso il seguente:

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

Non credo che risolverà effettivamente il tuo problema, che sembra essere un problema di scope, ma è il codice che utilizzo.

Per quanto riguarda la differenza tra include e require:
include genererà un warning se il file non viene trovato
require genererà un errore fatale se il file non viene trovato

include_once e require_once non includeranno/richiederanno nuovamente il file/codice se è già stato incluso/richiesto (nota che per quanto ne so, questo vale solo per un file specifico in una directory specifica).

21 gen 2011 05:29:35
1

Include

L'istruzione include() include e valuta il file specificato.

Include Once

L'istruzione include_once() include e valuta il file specificato durante l'esecuzione dello script. Questo comportamento è simile all'istruzione include(), con l'unica differenza che se il codice di un file è già stato incluso, non verrà incluso nuovamente. Come suggerisce il nome, verrà incluso solo una volta.

Require

require() e include() sono identici in tutto tranne nel modo in cui gestiscono gli errori. Entrambi producono un Warning, ma require() risulta in un Fatal Error. In altre parole, non esitare a usare require() se vuoi che un file mancante interrompa l'elaborazione della pagina.

Require Once

L'istruzione require_once() include e valuta il file specificato durante l'esecuzione dello script. Questo comportamento è simile all'istruzione require(), con l'unica differenza che se il codice di un file è già stato incluso, non verrà incluso nuovamente.

Le informazioni sopra sono tratte dalla documentazione PHP, il fatto è che non esiste una scelta corretta in assoluto, dipenderà dalle necessità del codice. Io uso require() per elementi importanti come le funzioni, ma per file del tema come il footer o il loop uso include_once o include perché posso gestire il warning e comunicare all'utente/visitatore che è avvenuto un errore invece di mostrare semplicemente un fatal_error.

21 gen 2011 05:34:04
Commenti

Come suggerisce @mtekk, ti consiglierei di utilizzare questa struttura:

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

Webord Webord
21 gen 2011 05:35:48
1

Prima di tutto, grazie a tutti coloro che hanno risposto,

Il mio problema era il richiamo dei file inclusi con URL completo, in questo modo non passavano attraverso WordPress. Questo è accaduto perché, come ho detto nella domanda, li richiamavo dal file principale del plugin. Quindi la soluzione è stata utilizzare:

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

Ho letto a riguardo nel supporto di WordPress. E ancora grazie per le risposte!

21 gen 2011 06:00:37
Commenti

Puoi per favore riconsiderare di contrassegnare questa risposta (https://wordpress.stackexchange.com/a/32002/123092) come quella accettata?

I am the Most Stupid Person I am the Most Stupid Person
18 set 2017 13:28:05
0
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

oppure

define( 'PLUGIN_ROOT_DIR', plugin_dir_path( __FILE__ ) );
include( PLUGIN_ROOT_DIR . 'ipn/paypal-ipn.php');

o

$plugin_dir_path = plugin_dir_path( __FILE__ );
include( $plugin_dir_path . 'ipn/paypal-ipn.php');

Nota: per includere file .css e .js con admin_enqueue_scripts all'interno del plugin usa plugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');
13 mag 2016 19:35:20
0

Ciao @בניית אתרים:

Quando WordPress si carica, definisce la funzione add_action() prima di tentare di caricare qualsiasi plugin. Il fatto che tu stia ricevendo questo errore mi dice che stai facendo qualcosa di strano o che c'è qualcosa che non va nella tua installazione di WordPress.

Come stai facendo caricare il tuo "plugin"? Stai usando include*() o require*() per caricarlo, magari nel tuo file wp-config.php?

21 gen 2011 05:46:32
1

Ogni volta che crei un nuovo file all'interno della tua directory di lavoro, devi includerlo manualmente ogni volta. Ma prova un metodo per scansionare automaticamente la tua directory e allegare i file, non solo quelli PHP, che aiuta a includere correttamente i file PHP, JS e CSS sia nel backend che nel frontend.

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

29 mag 2014 07:56:52
Commenti

Per favore aggiungi informazioni rilevanti dal link fornito alla tua risposta. Usa il link per scopi di attribuzione. Per favore [modifica] la tua domanda

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

Potrebbe anche funzionare:

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

25 mar 2022 18:29:41