Il modo corretto per includere/richiedere file PHP in WordPress
Sono uno sviluppatore WordPress alle prime armi e recentemente ho avuto problemi (su più siti) con include_once
e require_once
per i file PHP. Se includo (get_theme_directory_uri() . 'subdir/file')
il file specificato viene incluso (o richiesto, il che porta a errori fatali) ma se all'interno di 'file' vengono chiamate funzioni di WordPress ottengo qualcosa simile a:
'Call to undefined function
add_action()
in /percorso/completo/al/file'.
La soluzione apparente che ho trovato è fare:
include(dirname(__FILE__) . "/subdir/filename");
È corretto o mi sono perso 'il modo WordPress' per includere i file da qualche parte?

Se controlli https://codex.wordpress.org/Function_Reference/get_template_directory_uri
Vedrai che get_template_directory_uri()
restituisce un URI, non un percorso del server.
Dovresti invece utilizzare la funzione get_template_directory()
, che restituisce il percorso del tema, senza la barra finale:
include get_template_directory() . '/subdir/filename.php';
Per un plugin puoi usare la funzione plugin_dir_path()
:
include plugin_dir_path( __FILE__ ) . '/subdir/filename.php';

Voglio precisare che questo è principalmente pensato per individuare percorsi in plugin arbitrari. All'interno di un plugin specifico i percorsi relativi sono noti e i classici include PHP (senza alcun elemento di WP) sono una pratica normale.

Con il commento di Rarst ho realizzato che la mia risposta è per i plugin, non per i temi. Per i temi, usa get_template_directory() invece di get_template_directory_uri(). Facile!

WordPress 4.7+ introduce le funzioni get_theme_file_path() per includere file nel tema WordPress.
Includi in questo modo:
include get_theme_file_path( '/sottocartella/nomefile.php' );
Il vantaggio di utilizzare questa funzione è che nei child theme puoi sovrascrivere il file del tema genitore.
Riferimento : https://developer.wordpress.org/reference/functions/get_theme_file_path/

Nei seguenti esempi, assumo che tu stia utilizzando composer e che un tema figlio possa essere attivato o meno.
- Utilizza questo metodo se vuoi includere un file all'interno di un tema e vuoi assicurarti che venga utilizzata la directory del tema genitore anche se è attivato un tema figlio:
require get_template_directory() . '/vendor/autoload.php';
- Oppure utilizza questo metodo se vuoi includere un file all'interno di un tema e non ti interessa se viene utilizzata la directory del tema genitore o quella del tema figlio (se è attivato):
require get_stylesheet_directory() . '/vendor/autoload.php';
- Infine, utilizza questo metodo se vuoi includere un file all'interno di un plugin:
require __DIR__ . '/vendor/autoload.php';
Fai attenzione con l'ultimo metodo perché la costante magica __DIR__
avrà un valore diverso a seconda della directory in cui si trova il tuo file php.
Nota che non c'è alcun vantaggio nell'utilizzare la funzione plugin_dir_path()
in quanto è semplicemente un wrapper per la funzione trailingslashit()
.
La documentazione afferma:
La parte "plugin" del nome è fuorviante - può essere utilizzata per qualsiasi file, e non restituirà la directory di un plugin a meno che non venga chiamata all'interno di un file nella directory base del plugin.
Vedi https://developer.wordpress.org/reference/functions/plugin_dir_path/ per maggiori dettagli.
Nota inoltre che usare include
è una pratica scadente perché un file mancante genererà solo un avviso. Utilizza sempre require
, poiché un file mancante genererà un errore fatale e non passerà inosservato.
