Modul corect de a include/require fișiere PHP în WordPress
Sunt un dezvoltator WordPress începător și recent am avut probleme (pe mai multe site-uri) cu include_once
și require_once
pentru fișierele PHP. Dacă includ (get_theme_directory_uri() . 'subdir/file')
fișierul specificat este inclus (sau required, ceea ce duce la erori fatale), dar dacă orice funcție WordPress este apelată în 'file' primesc ceva similar cu:
'Apel către funcție nedefinită
add_action()
în /calea/completă/către/fișier'.
Soluția aparentă pe care am găsit-o este să fac:
include(dirname(__FILE__) . "/subdir/filename");
Este corect sau am ratat 'modul WordPress' de a include fișierele undeva?

Dacă verifici https://codex.wordpress.org/Function_Reference/get_template_directory_uri
Vei vedea că get_template_directory_uri()
returnează un URI, nu o cale pe server.
Ar trebui să folosești în schimb funcția get_template_directory()
, care returnează calea către tema, fără slash la final:
include get_template_directory() . '/subdir/filename.php';
Pentru un plugin poți folosi funcția plugin_dir_path()
:
include plugin_dir_path( __FILE__ ) . '/subdir/filename.php';

Vreau să precizez că acest lucru este în principal destinat localizării căilor în plugin-uri arbitrare. În interiorul unui plugin specific, căile relative sunt cunoscute și includerile PHP de bază (fără componente WP) sunt o practică normală.

Cu comentariul lui Rarst, mi-am dat seama că răspunsul meu este pentru plugin-uri, nu pentru teme. Pentru teme, folosește get_template_directory() în loc de get_template_directory_uri(). Simplu!

WordPress 4.7+ introduce funcțiile get_theme_file_path() pentru a include fișiere în tema WordPress.
Includeți astfel:
include get_theme_file_path( '/subdirector/numele-fisierului.php' );
Avantajul utilizării acestei funcții este că în tema copil puteți suprascrie fișierul din tema părinte.
Referință : https://developer.wordpress.org/reference/functions/get_theme_file_path/

În următoarele exemple, presupun că utilizați Composer și că un tema copil (child theme) poate fi activat sau nu.
- Folosiți această metodă dacă doriți să includeți un fișier într-o temă și doriți să vă asigurați că este utilizat directorul temei părinte (parent theme) chiar dacă este activată o temă copil:
require get_template_directory() . '/vendor/autoload.php';
- Sau utilizați această metodă dacă doriți să includeți un fișier într-o temă și nu contează dacă este utilizat directorul temei părinte sau directorul temei copil, dacă este activată o temă copil:
require get_stylesheet_directory() . '/vendor/autoload.php';
- Și, în final, utilizați această metodă dacă doriți să includeți un fișier într-un plugin:
require __DIR__ . '/vendor/autoload.php';
Aveți grijă cu ultima metodă, deoarece constanta magică __DIR__
va avea o valoare diferită în funcție de directorul în care se află fișierul PHP.
Rețineți că nu există niciun beneficiu în utilizarea funcției plugin_dir_path()
, deoarece aceasta este doar un wrapper pentru funcția trailingslashit()
.
Documentația spune:
Partea de „plugin” din denumire este înșelătoare – poate fi utilizată pentru orice fișier și nu va returna directorul unui plugin decât dacă o apelați într-un fișier din directorul de bază al plugin-ului.
Consultați https://developer.wordpress.org/reference/functions/plugin_dir_path/ pentru mai multe detalii.
De asemenea, rețineți că utilizarea include
este o practică slabă, deoarece un fișier lipsă va genera doar un avertisment. Utilizați întotdeauna require
, deoarece un fișier lipsă va genera o eroare fatală și nu va rămâne neobservat.
