Come includere i file PHP nei plugin nel modo corretto


59

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

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

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

add_action('hook', 'callback');

e ottengo:

Errore irreversibile: chiamata alla funzione indefinita add_action ()

Ora, prima di dire "usa if(**function_exists**('add_action')){" se lo uso, non funziona.

Le domande:

  • Quale sarebbe il modo corretto per farlo?
  • Quali sono le differenze tra include, include_once, requiree quando fare uso strega?

stai facendo qualcosa di sbagliato se ricevi quel messaggio. Assicurati di includere tutti i file prima di iniziare a eseguire le funzioni da questi file
onetrickpony,

non è così, le chiamate sono all'interno dei file che sto includendo!
Bainternet,

lol, ora vedo WP_PLUGIN_URLnel tuo codice sopra :)
onetrickpony,

3
In parole povere, puoi includere solo i file () tramite un percorso file e non un URI.
editore

1
Questo articolo del Codex (probabilmente scritto dopo aver posto la tua domanda) è abbastanza utile: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

Risposte:


88

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

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

Si noti che la funzione non restituisce lo slash per il percorso del file.


3
Si noti che utilizzandolo __FILE__verrà generato in relazione al file corrente da cui lo si chiama, quindi se la propria includeistruzione viene eseguita da una sottodirectory all'interno della struttura del file del plug-in, verrà ripristinata anche la sottodirectory.
squarecandy

L'alternativa - se require_once(plugin_dir_path(__DIR__).'/myfile.inc');
AVETE

10

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

Definisci la directory del tuo plugin

All'interno del tuo plugin hai la seguente definizione per definire la posizione corrente del plugin.

Codice di esempio:

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

Solo un diritto include o richiede

Puoi semplicemente usare; include, include_once, request o request_once all'interno della cartella del plugin facendo riferimento alla posizione come nel codice di esempio riportato di seguito. L'esempio seguente si baserà su un file nella directory del plug-in principale, incluso un altro file all'interno di una cartella all'interno della cartella del plug-in.

Codice di esempio:

include "classes/plugin-core.php";

le inclusioni relative possono portare a tutti i tipi di problemi inattesi spiacevoli.
Mark Kaplun il

5

Alla fine rinuncio ai costrutti di WordPress per le inclusioni e utilizzo quanto segue:

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

Non penso che risolverà effettivamente il tuo problema, che sembra essere un problema di portata, ma è il codice che uso.

Per quanto riguarda la differenza tra include e request:
include lancerà un avviso se il file non viene trovato
richiede lancerà un errore fatale se il file non viene trovato

include_once e request_once non includerà / richiederà nuovamente il file / codice se è già stato incluso / richiesto (si noti che, per quanto posso dire, questo è solo per un file specifico in una directory specifica).


5

Innanzitutto, grazie a tutti coloro che hanno risposto,

Il mio problema era chiamare i file inclusi con l'URL completo in modo che non passassero attraverso WordPress. e ciò è accaduto perché, come ho affermato sulla domanda, li chiamavo dal file del plugin principale. così la correzione è finita usando:

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

ho letto al supporto di WordPress . e ancora grazie per aver risposto!


Potete riconsiderare per contrassegnare questa risposta ( wordpress.stackexchange.com/a/32002/123092 ) come accettata?
Sono la persona più stupida, il

4

Includere

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

Includi una volta

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

Richiedere

require () e include () sono identici in tutti i modi, ad eccezione di come gestiscono il fallimento. Entrambi producono un avviso, ma richiedono () risultati in un errore irreversibile. In altre parole, non esitare a utilizzare request () se desideri che un file mancante interrompa l'elaborazione della pagina.

Richiedi una volta

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

Le informazioni di cui sopra provengono dalla documentazione di PHP, la cosa è che non ce n'è una corretta, dipenderà dalla necessità del codice, ho bisogno () di cose importanti come le funzioni, ma da file di temi come piè di pagina o il ciclo che uso include_once o include perché posso gestire l'avviso e dire all'utente / visitatore che è accaduto un errore anziché un errore fatale


Come dice @mtekk, ti ​​consiglio di usare questa struttura: require_once (dirname ( FILE ). '/Filename.php);
Webord,

1

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

Durante il caricamento di WordPress, definisce la add_action()funzione prima di tentare di caricare eventuali plugin. Il fatto che stai ricevendo l'errore mi dice che stai facendo qualcosa di strano o che qualcosa non va nella tua installazione di WordPress.

Chi stai caricando il tuo "plugin" ? Stai usando un include*()o require*()per caricarlo, forse nel tuo wp-config.phpfile?


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

o

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 accodare i file .css e .js admin_enqueue_scriptsall'interno del plug-inplugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');

0

Ogni volta che crei un nuovo file nella directory di lavoro, devi includerlo ogni volta. Ma prova un metodo per scansionare il tuo directroy e collegarlo automaticamente, non solo i file php, il che aiuta a includere correttamente i file php, js e css su entrambi i lati (backend, front-end).

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


1
Aggiungi le informazioni pertinenti dal link fornito alla tua risposta. Utilizzare il collegamento a fini di credito. Si prega di modificare la tua domanda
Pieter Goosen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.