Qual è la differenza tra get_home_path() e ABSPATH?
Dovrebbero fare la stessa cosa, ma in certe condizioni potrebbero non farlo.
Prima di tutto nota:
- che la descrizione nell'entry del codex è fuorviante
- che
wp-admin/includes/file.php
deve essere incluso nel contesto, altrimenti chiamareget_home_path()
porterà a chiamare una funzione non definita.
Riguardo all'entry del codex,
Descrizione
Ottieni il percorso assoluto del filesystem alla root dell'installazione di WordPress.
Valore di Ritorno
Percorso completo del filesystem alla root dell'installazione di WordPress. Se installi WordPress in una sottocartella, mostrerà la posizione della sottocartella
Esempi
$path = get_home_path(); print "Path: ".$path; // Ritorna "Path: /var/www/htdocs/" o "Path: /var/www/htdocs/wordpress/" se è una sottocartella
Afferma che il valore di ritorno sarà il percorso della sottocartella se hai installato WordPress in una sottodirectory. Questo è, di fatto, errato.
get_home_path()
ritornerà la directory root della tua installazione di WordPress, anche se è installata in una sottodirectory. Questo è lo scopo della funzione.
Assumi che la tua installazione di WordPress sia all'interno di una sottodirectory chiamata /dev
,
- http://www.example.com/dev (
site_url
) (es. /var/www/htdocs/dev) - http://www.example.com/ (
home_url
)
Se registri una chiamata a ABSPATH
, allora il risultato sarà /var/www/htdocs/dev
, che non è la root della tua installazione. La root della tua installazione è /var/www/htdocs
.
ABSPATH
è definito per la prima volta in wp-load.php
che si troverà in /var/www/htdocs/dev/wp-load.php
, quindi è da qui che ABSPATH
prenderà la sua definizione.
Se analizzi ulteriormente get_home_path()
, noterai che se site_url
e home_url
differiscono, allora viene presa una sottostringa del percorso governata dalla posizione (prima occorrenza) della sottodirectory trovata all'interno della stringa.
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 );
}
Pertanto, come risultato di questo, get_home_path()
e ABSPATH
possono restituire risultati diversi se hai WordPress installato in una sottodirectory.
In secondo luogo, chiamare get_home_path()
deve essere fatto in un contesto dove il suddetto wp-admin/includes/file.php
è già stato incluso.
Ad esempio, usare get_home_path()
all'interno dell'hook admin_init
va bene, mentre usarlo all'interno di init
no.
Visto che questo file viene incluso solo nel contesto dell'amministrazione (dashboard), se ne hai assolutamente bisogno al di fuori di questo contesto dovrai includere il file tu stesso prima di chiamare la funzione,
require_once(ABSPATH . 'wp-admin/includes/file.php');
Ironicamente (o no) che usa ABSPATH
:D

Ben spiegato, anche se penso che gli sviluppatori terzi non dovrebbero usare né la costante né la funzione. Poiché WordPress può essere posizionato ovunque, metterlo al di fuori della root del documento fa sì che sia la costante che la funzione restituiscano ad esempio /var/apps/wordpress
invece di /var/www/htdocs
. È meglio usare $_SERVER['DOCUMENT_ROOT']
, almeno se si può assicurare che la root del documento non cambierà.

@Fleuv In effetti è una situazione complicata... anche $_SERVER['DOCUMENT_ROOT']
ha i suoi problemi... ad esempio potrebbe non essere impostato o non essere impostato correttamente e così via. Ci sono altri modi che mi vengono in mente per gestire questo... Ognuno con le proprie sfumature. Che divertimento :)

Ben spiegato da Adam ma non ha fornito una soluzione per evitare di usare ABSPATH
.
Questo è necessario quando dobbiamo ottenere il percorso di wp-admin e wp-admin/includes/file.php non è incluso, come nell'hook init o nell'esecuzione sul frontend.
Possiamo evitare di chiamare ABSPATH
in require_once(ABSPATH . 'wp-admin/includes/file.php');
Copiando la definizione di get_home_path()
in un file nel tuo progetto e includendo quel file se si verifica la seguente condizione come
if ( ! function_exists( 'get_home_path' ) ) {
require_once MY_PLUGIN_DIR . 'includes/helpers/admin_functions.php';
}
e all'interno del tuo MY_PLUGIN_DIR . 'includes/helpers/admin_functions.php'
copia la funzione get_home_path()
da 'wp-admin/includes/file.php'.
L'aggiornamento di WP non causerà problemi poiché questa funzione dipende solo da funzioni PHP e alcune funzioni di inclusione minori. Quindi stiamo evitando ABSPATH quando necessario.
