Il modo corretto per includere/richiedere file PHP in WordPress

27 ott 2015, 13:44:35
Visualizzazioni: 96.1K
Voti: 14

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?

1
Tutte le risposte alla domanda 3
4
25

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';
27 ott 2015 19:39:26
Commenti

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.

Rarst Rarst
27 ott 2015 19:46:51

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!

thomascharbit thomascharbit
27 ott 2015 19:58:09

potresti provare - /subdir/filename.php?

Jon Jon
15 apr 2019 11:53:48

@Jon grazie, stessa osservazione. Ho inviato una modifica alla risposta.

kontur kontur
16 feb 2023 14:44:47
2
19

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/

14 mag 2019 12:09:51
Commenti

Esattamente quello che stavo cercando! Questa dovrebbe essere la risposta corretta ora.

Oneezy Oneezy
23 ago 2019 16:04:02

Esatto, WP ha aggiornato l'helper per farlo, questa è la risposta giusta.

Maxime Culea Maxime Culea
16 set 2020 19:24:55
0

Nei seguenti esempi, assumo che tu stia utilizzando composer e che un tema figlio possa essere attivato o meno.

  1. 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';
  1. 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';
  1. 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.

23 dic 2022 22:49:51