Come includere correttamente i file PHP nei plugin
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?

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.

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.

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";

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

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.

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!

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

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

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
?

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/
