Jaka jest różnica między get_home_path () a ABSPATH?

27

Jaka jest różnica między get_home_path()i ABSPATH? Czy nie ma sensu wskazywać na root instalacyjny WordPress?

Borek Bernard
źródło

Odpowiedzi:

33

Oni powinni zrobić to samo, ale pod pewnymi warunkami, nie może.

Przede wszystkim uwaga:

W odniesieniu do wpisu kodeksu

Opis

Uzyskaj bezwzględną ścieżkę systemu plików do katalogu głównego instalacji WordPress.

Zwracana wartość

Pełna ścieżka systemu plików do katalogu głównego instalacji WordPress. Jeśli zainstalujesz wordpress w podfolderze, wyświetli się lokalizacja podfolderu

Przykłady

$path = get_home_path();
print "Path: ".$path; // Return "Path: /var/www/htdocs/" or "Path: /var/www/htdocs/wordpress/" if it is subfolder

Wskazuje, że zwracana wartość zwróci ścieżkę do podfolderu, jeśli WordPress został zainstalowany w podkatalogu. To jest w rzeczywistości niepoprawne.

get_home_path()zwróci katalog główny instalacji WordPress, nawet jeśli jest on zainstalowany w podkatalogu. Taki jest cel funkcji.

Załóżmy, że instalacja WordPress znajduje się w podkatalogu o nazwie /dev,

Jeśli zarejestrujesz połączenie z ABSPATH, to wynikiem będzie, /var/www/htdocs/devktóry nie jest katalogiem głównym instalacji. Katalog główny twojej instalacji to /var/www/htdocs.

ABSPATHjest najpierw zdefiniowany, w wp-load.phpktórym będzie się znajdować, /var/www/htdocs/dev/wp-load.phpstąd ABSPATHbierze się jego definicja.

Jeśli przyjrzysz się get_home_path()dalej, zauważysz, że jeśli site_urli home_urlróżnią się, to podciąg jest brany ze ścieżki rządzonej przez pozycję (pierwsze wystąpienie) podkatalogu znalezionego w ciągu.

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 );
}

W związku z tym, w wyniku tego, get_home_path()a ABSPATHmoże zwracać różne wyniki, jeśli masz WordPress zainstalowane w podkatalogu.

Po drugie, połączenia get_home_path()należy wykonywać w kontekście, w którym wspomniano wp-admin/includes/file.phpjuż o tym.

Na przykład używanie get_home_path()wewnątrz admin_inithaka jest w porządku, gdy używanie wewnątrz initnie jest.

Ponieważ plik ten jest dołączany tylko w kontekście administratora (pulpitu nawigacyjnego), jeśli absolutnie potrzebujesz go poza tym kontekstem, musisz sam go dołączyć przed wywołaniem funkcji,

require_once(ABSPATH . 'wp-admin/includes/file.php');

Jak na ironię (lub nie), która wykorzystuje ABSPATH: D

Adam
źródło
Dobrze wyjaśnione, choć myślę, że twórcy stron trzecich nie powinni używać stałej ani funkcji. Ponieważ WordPress można zlokalizować w dowolnym miejscu , umieszczenie go poza katalogiem głównym powoduje, że zarówno stała, jak i funkcja zwracają np. /var/apps/wordpressZamiast /var/www/htdocs. Raczej użyj $_SERVER['DOCUMENT_ROOT'], przynajmniej jeśli możesz zapewnić, że katalog główny dokumentu się nie zmieni.
Fleuv
@Fleuv Rzeczywiście jest to trudna sprawa ... nawet $_SERVER['DOCUMENT_ROOT']ma swoje problemy ... np. Może nie być ustawiona lub ustawiona poprawnie i tak dalej. Są też inne sposoby, w jakie mogę wymyślić, aby sobie z tym poradzić ... Każdy z własnymi zastrzeżeniami. Dużo zabawy :)
Adam
1
To rozwiązanie zostało dobrze wyjaśnione i działało dokładnie tak, jak było pożądane po tym, jak WP zgłosił błąd „niezdefiniowany”. Dzięki;)
Chris Sprague,
-1

Korzystam z home_url () do linkowania do strony głównej w WP. Czasami site_url () może nie być tak naprawdę twoim home_url () . Możesz zdefiniować specjalną stronę jako stronę główną w Wordpress.

mdikici
źródło