Qual è la differenza tra get_home_path() e ABSPATH?

15 mag 2015, 14:53:05
Visualizzazioni: 34.1K
Voti: 33

Qual è la differenza tra get_home_path() e ABSPATH? Non dovrebbero entrambi puntare alla directory root dell'installazione WordPress?

0
Tutte le risposte alla domanda 3
3
41

Dovrebbero fare la stessa cosa, ma in certe condizioni potrebbero non farlo.

Prima di tutto nota:

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,

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

15 mag 2015 16:49:17
Commenti

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à.

luukvhoudt luukvhoudt
13 feb 2018 22:28:02

@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 :)

Adam Adam
19 mar 2018 10:01:18

Questa soluzione era ben spiegata e ha funzionato esattamente come desiderato dopo che WP mostrava l'errore "non definito". Grazie ;)

Chris Sprague Chris Sprague
9 lug 2018 15:39:50
0

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.

11 giu 2022 08:27:07
0
-1

Sto utilizzando home_url() per creare il link alla pagina "Home" di WordPress. A volte, site_url() potrebbe non corrispondere effettivamente al tuo home_url(). In WordPress puoi definire una pagina specifica come homepage.

23 lug 2018 13:20:00