Care este diferența dintre get_home_path() și ABSPATH?

15 mai 2015, 14:53:05
Vizualizări: 34.1K
Voturi: 33

Care este diferența dintre get_home_path() și ABSPATH? Nu au ambele rolul de a indica către directorul rădăcină al instalării WordPress?

0
Toate răspunsurile la întrebare 3
3
41

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:

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,

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

15 mai 2015 16:49:17
Comentarii

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.

luukvhoudt luukvhoudt
13 feb. 2018 22:28:02

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

Adam Adam
19 mar. 2018 10:01:18

Această soluție a fost bine explicată și a funcționat exact cum doream după ce WP a aruncat eroarea "not defined". Mulțumesc ;)

Chris Sprague Chris Sprague
9 iul. 2018 15:39:50
0

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.

11 iun. 2022 08:27:07
0
-1

Folosesc home_url() pentru a crea un link către pagina "Acasă" din WP. Uneori, site_url() poate să nu fie chiar același lucru cu home_url(). În WordPress poți defini o pagină specifică ca pagină de start.

23 iul. 2018 13:20:00