get_home_path()WP 1.5.0

Получает абсолютный путь до корневой папки сайта (где находится wp-config.php). Результат может отличаться от константы ABSPATH. Имеет закрывающий слэш на конце.

На многих серверах функция возвращает тоже что и $_SERVER['DOCUMENT_ROOT'] или ABSPATH.

На фронте функция работает некорректно, подробнее смотрите пример 1.

Для работы функции должен быть подключен файл:

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

Хуков нет.

Возвращает

Строку. Путь до каталога (папки).

Использование

get_home_path();

Примеры

0

#1 Демонстрация работы

Допустим ядро ВП у нас установлено в под-папку wp:

// Убедимся что get_home_path() определен
require_once ABSPATH . 'wp-admin/includes/file.php';

echo get_home_path();
echo ABSPATH;                     
echo $_SERVER['SCRIPT_FILENAME'];
echo $_SERVER['DOCUMENT_ROOT'];

/* 
В админке:
path/sites/site.com/www/
path/sites/site.com/www/wp/
path/sites/site.com/www/wp/wp-admin/options-permalink.php
path/sites/site.com/www

На фронте:
/
path/sites/site.com/www/wp/
path/sites/site.com/www/index.php
path/sites/site.com/www
*/

На фронте функция работает некорректно, потому что она опирается на разницу между опциями home и siteurl. В данном случае это строка wp/. Далее из SCRIPT_FILENAME вырезается все от начала до этой позиции - это и возвращается функцией с добавление слэша в конец. А так как на фронте SCRIPT_FILENAME вообще не содержит подстроки wp/, то путь получается пустой - его невозможно определить.

Выглядит это как баг.

0

#2 Получим путь до основной папки сайта

В этой папке обычно находится файл wp-config.php и .htaccess. Допустим нам нужно изменить файл .htaccess

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

$home_path = get_home_path();
$htaccess_file = $home_path .'.htaccess';

/*
 * If the file doesn't already exist check for write access to the directory
 * and whether we have some rules. Else check for write access to the file.
 */
if ( 
	( ! file_exists($htaccess_file) && is_writable($home_path) ) || 
	is_writable( $htaccess_file )
) {
	$rules = '
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
';

	$rules = array_filter( explode( "\n", $rules ) );

	$done = insert_with_markers( $htaccess_file, 'My Custom Rules', $rules );
}
else {
	echo '$htaccess_file не существует или закрыт для записи.';
}

Список изменений

С версии 1.5.0 Введена.

Код get_home_path() WP 6.5.2

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