Care este diferența dintre get_home_path() și ABSPATH?
Ei ar trebui să facă același lucru, dar în anumite condiții, este posibil să nu o facă.
Mai întâi de toate, rețineți:
- că descrierea din codex este înșelătoare
- că
wp-admin/includes/file.php
trebuie inclus în context, altfel apelarea funcțieiget_home_path()
va duce la apelarea unei funcții nedefinite.
Referitor la intrarea din codex,
Descriere
Obține calea absolută în sistemul de fișiere către rădăcina instalării WordPress.
Valoare returnată
Calea completă în sistemul de fișiere către rădăcina instalării WordPress. Dacă WordPress este instalat într-un subdirector, va afișa locația subdirectorului.
Exemple
$path = get_home_path(); print "Path: ".$path; // Returnează "Path: /var/www/htdocs/" sau "Path: /var/www/htdocs/wordpress/" dacă este subdirector
Se afirmă că valoarea returnată va fi calea către subdirector dacă WordPress este instalat într-un subdirector. De fapt, acest lucru este incorect.
get_home_path()
va returna directorul rădăcină al instalării WordPress, chiar dacă este instalat într-un subdirector. Acesta este scopul funcției.
Să presupunem că instalarea WordPress este într-un subdirector numit /dev
,
- http://www.example.com/dev (
site_url
) (de exemplu, /var/www/htdocs/dev) - http://www.example.com/ (
home_url
)
Dacă înregistrați un apel la ABSPATH
, rezultatul va fi /var/www/htdocs/dev
, care nu este rădăcina instalării. Rădăcina instalării este /var/www/htdocs
.
ABSPATH
este definit prima dată în wp-load.php
, care va fi localizat la /var/www/htdocs/dev/wp-load.php
, deci de aici va lua definiția sa ABSPATH
.
Dacă inspectați get_home_path()
mai detaliat, veți observa că dacă site_url
și home_url
diferă, atunci se ia un subșir al căii determinat de poziția (prima apariție) a subdirectorului găsit în șir.
function get_home_path() {
$home = set_url_scheme( get_option( 'home' ), 'http' );
$siteurl = set_url_scheme( get_option( 'siteurl' ), 'http' );
if ( ! empty( $home ) && 0 !== strcasecmp( $home, $siteurl ) ) {
$wp_path_rel_to_home = str_ireplace( $home, '', $siteurl ); /* $siteurl - $home */
$pos = strripos( str_replace( '\\', '/', $_SERVER['SCRIPT_FILENAME'] ), trailingslashit( $wp_path_rel_to_home ) );
$home_path = substr( $_SERVER['SCRIPT_FILENAME'], 0, $pos );
$home_path = trailingslashit( $home_path );
} else {
$home_path = ABSPATH;
}
return str_replace( '\\', '/', $home_path );
}
Prin urmare, ca urmare a acestui lucru, get_home_path()
și ABSPATH
pot returna rezultate diferite dacă WordPress este instalat într-un subdirector.
În al doilea rând, apelarea get_home_path()
trebuie făcută într-un context în care fișierul menționat anterior wp-admin/includes/file.php
a fost deja inclus.
De exemplu, utilizarea get_home_path()
în cadrul hook-ului admin_init
este în regulă, în timp ce utilizarea sa în cadrul init
nu este.
Având în vedere că acest fișier este inclus doar în contextul admin (dashboard), dacă aveți nevoie absolută de el în afara acestui context, va trebui să includeți fișierul înainte de a apela funcția,
require_once(ABSPATH . 'wp-admin/includes/file.php');
Ironie (sau nu) care folosește ABSPATH
:D

Explicație clară, deși cred că dezvoltatorii terți nu ar trebui să folosească nici constanta, nici funcția. Deoarece WordPress poate fi localizat oriunde, plasarea lui în afara rădăcinii documentului face ca atât constanta cât și funcția să returneze de exemplu /var/apps/wordpress
în loc de /var/www/htdocs
. Mai bine folosiți $_SERVER['DOCUMENT_ROOT']
, cel puțin dacă vă puteți asigura că rădăcina documentului nu se va schimba.

@Fleuv Într-adevăr, aceasta este o problemă complicată... chiar și $_SERVER['DOCUMENT_ROOT']
are problemele sale... de exemplu, poate să nu fie setat sau setat corect și așa mai departe. Există și alte modalități de a gestiona asta... Fiecare cu propriile limitări. Multă distracție :)

Explicația lui Adam este bună, dar nu a oferit o soluție pentru a evita utilizarea ABSPATH
.
Aceasta este necesară atunci când avem nevoie de calea către wp-admin, iar fișierul wp-admin/includes/file.php nu este inclus, cum ar fi în cazul hook-ului init sau al execuției pe frontend.
Putem evita apelarea ABSPATH
în require_once(ABSPATH . 'wp-admin/includes/file.php');
prin copierea definiției funcției get_home_path()
într-un fișier din proiectul tău și includerea acelui fișir dacă este îndeplinită următoarea condiție:
if ( ! function_exists( 'get_home_path' ) ) {
require_once MY_PLUGIN_DIR . 'includes/helpers/admin_functions.php';
}
iar în interiorul fișierului MY_PLUGIN_DIR . 'includes/helpers/admin_functions.php'
copiază funcția get_home_path()
din 'wp-admin/includes/file.php'.
Actualizările WordPress nu vor cauza probleme, deoarece această funcție depinde doar de funcții PHP și unele funcții minore de includere. Astfel, evităm utilizarea ABSPATH atunci când este necesar.
