Was ist der Unterschied zwischen get_home_path () und ABSPATH?

27

Was ist der Unterschied zwischen get_home_path()und ABSPATH? Ist es nicht der Sinn von beidem, auf das WordPress-Installationsstammverzeichnis zu verweisen?

Borek Bernard
quelle

Antworten:

33

Sie sollten dasselbe tun, aber unter bestimmten Umständen auch nicht.

Zuallererst Anmerkung:

In Bezug auf den Codex-Eintrag,

Beschreibung

Ermitteln Sie den absoluten Dateisystempfad zum Stammverzeichnis der WordPress-Installation.

Rückgabewert

Vollständiger Dateisystempfad zum Stammverzeichnis der WordPress-Installation. Wenn Sie WordPress im Unterordner installieren, wird der Speicherort des Unterordners angezeigt

Beispiele

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

Der Rückgabewert gibt den Pfad des Unterordners zurück, wenn Sie WordPress in einem Unterverzeichnis installiert haben. Dies ist in der Tat falsch.

get_home_path()gibt das Stammverzeichnis Ihrer WordPress-Installation zurück, auch wenn es in einem Unterverzeichnis installiert ist. Das ist der Zweck der Funktion.

Angenommen , Ihre Wordpress - Installation in einem Unterverzeichnis aufgerufen /dev,

Wenn Sie einen Anruf bei protokollieren ABSPATH, /var/www/htdocs/devlautet das Ergebnis, das nicht der Stamm Ihrer Installation ist. Die Wurzel Ihrer Installation ist /var/www/htdocs.

ABSPATHwird zuerst definiert, an wp-load.phpwelcher Stelle es sich befindet, /var/www/htdocs/dev/wp-load.phpdaher wird hier ABSPATHdie Definition vorgenommen.

Wenn Sie die Inspektion get_home_path()weiter werden Sie feststellen , dass , wenn die site_urlund home_urlunterscheidet, dann eine Unterkette des Wegs durch die Position (erste Vorkommen) des Unterverzeichnisses geregelt genommen wird innerhalb der Zeichenfolge gefunden.

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

Daher wird als Ergebnis dieser, get_home_path()und ABSPATHkönnen unterschiedliche Ergebnisse zurück , wenn Sie Wordpress in einem Unterverzeichnis installiert haben.

Zweitens get_home_path()muss das Anrufen in einem Kontext erfolgen, in dem das Afortmentioned wp-admin/includes/file.phpbereits enthalten ist.

Als Beispiel ist die Verwendung get_home_path()innerhalb des admin_initHakens in Ordnung, wohingegen die Verwendung innerhalb initnicht in Ordnung ist.

Da diese Datei nur im Admin-Kontext (Dashboard) enthalten ist, müssen Sie die Datei vor dem Aufrufen der Funktion selbst hinzufügen, wenn Sie sie außerhalb dieses Kontexts unbedingt benötigen.

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

Ironischerweise (oder nicht) welche verwendet ABSPATH: D

Adam
quelle
Gut erklärt, obwohl ich denke, dass Entwickler von Drittanbietern weder die Konstante noch die Funktion verwenden sollten. Da WordPress überall platziert werden kann , bewirkt das Platzieren außerhalb des Dokumentstamms, dass sowohl die Konstante als auch die Funktion zurückgegeben werden, z . B. /var/apps/wordpressstatt /var/www/htdocs. Verwenden $_SERVER['DOCUMENT_ROOT']Sie es lieber , zumindest wenn Sie sicherstellen können, dass sich der Dokumentenstamm nicht ändert.
Fleuv
@Fleuv In der Tat ist dies eine heikle $_SERVER['DOCUMENT_ROOT']Angelegenheit ... hat sogar Probleme ... zB kann es sein, dass sie nicht richtig eingestellt ist oder nicht richtig und so weiter. Ich kann mir auch andere Möglichkeiten vorstellen, damit umzugehen ... Jede mit ihren eigenen Einschränkungen. Viel Spaß :)
Adam
1
Diese Lösung wurde gut erklärt und funktionierte genau wie gewünscht, nachdem WP den "nicht definierten" Fehler ausgelöst hatte. Danke;)
Chris Sprague
-1

Ich verwende home_url (), um auf die "Home" -Seite von WP zu verlinken. Manchmal ist site_url () nicht unbedingt Ihre home_url () . Sie können in Wordpress eine bestimmte Seite als Homepage definieren.

mdikici
quelle