Какая разница между get_home_path()
а ABSPATH
? Не является ли смысл обоих указывать на установочный корень WordPress?
Какая разница между get_home_path()
а ABSPATH
? Не является ли смысл обоих указывать на установочный корень WordPress?
Ответы:
Они должны делать то же самое, но при определенных условиях не могут.
Прежде всего, обратите внимание:
wp-admin/includes/file.php
должно быть включено в контекст, иначе вызов get_home_path()
приведет к вызову неопределенной функции.Что касается записи кодекса,
Описание
Получить абсолютный путь файловой системы к корню установки WordPress.
Возвращаемое значение
Полный путь файловой системы к корню установки WordPress. Если вы установите WordPress в подпапке, он покажет расположение подпапки
Примеры
$path = get_home_path(); print "Path: ".$path; // Return "Path: /var/www/htdocs/" or "Path: /var/www/htdocs/wordpress/" if it is subfolder
В нем говорится, что возвращаемое значение будет возвращать путь к подпапке, если вы установили WordPress в подкаталог. Это на самом деле неправильно.
get_home_path()
вернет корневой каталог вашей установки WordPress, даже если он установлен в подкаталоге. Это цель функции.
Предположим , ваша установка WordPress находится в подкаталоге под названием /dev
,
site_url
) (например, / var / www / htdocs / dev)home_url
)Если вы войдете в вызов ABSPATH
, то будет результат, /var/www/htdocs/dev
который не является корнем вашей установки. Корень вашей установки есть /var/www/htdocs
.
ABSPATH
сначала определяется, в wp-load.php
котором он будет расположен, /var/www/htdocs/dev/wp-load.php
отсюда и ABSPATH
будет его определение.
Если вы изучите get_home_path()
далее, вы заметите, что если site_url
и home_url
отличаются, то берется подстрока пути, определяемого положением (первым появлением) подкаталога, найденного в строке.
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 );
}
Следовательно, в результате этого get_home_path()
и ABSPATH
могут возвращаться разные результаты, если у вас установлен WordPress в подкаталоге.
Во-вторых, вызов get_home_path()
должен быть сделан в контексте, в котором упомянутое wp-admin/includes/file.php
уже включено.
В качестве примера, использование get_home_path()
внутри admin_init
крючка хорошо, когда его использование внутри init
- нет.
Поскольку этот файл включается только из контекста администратора (приборной панели), если он вам абсолютно необходим за пределами этого контекста, вам нужно будет самому включить файл перед вызовом функции,
require_once(ABSPATH . 'wp-admin/includes/file.php');
Как ни странно (или нет) который использует ABSPATH
: D
$_SERVER['DOCUMENT_ROOT']
есть свои проблемы ... например, может быть не установлен или настроен правильно и так далее. Есть и другие способы, которыми я могу придумать, чтобы справиться с этим ... У каждого свои предостережения. Очень весело :)
/var/apps/wordpress
вместо/var/www/htdocs
. Скорее используйте$_SERVER['DOCUMENT_ROOT']
, по крайней мере, если вы можете гарантировать, что корень документа не изменится.