В чем разница между get_home_path () и ABSPATH?

27

Какая разница между get_home_path()а ABSPATH? Не является ли смысл обоих указывать на установочный корень WordPress?

Борек Бернард
источник

Ответы:

33

Они должны делать то же самое, но при определенных условиях не могут.

Прежде всего, обратите внимание:

  • что описание записи кодекса вводит в заблуждение
  • это 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,

Если вы войдете в вызов 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

Адам
источник
Хорошо объяснил, хотя я думаю, что сторонние разработчики не должны использовать ни константу, ни функцию. Поскольку WordPress может быть расположен где угодно , размещение его вне корня документа приводит к возврату как константы, так и функции, например, /var/apps/wordpressвместо /var/www/htdocs. Скорее используйте $_SERVER['DOCUMENT_ROOT'], по крайней мере, если вы можете гарантировать, что корень документа не изменится.
Fleuv
@Fleuv Действительно, это сложно ... даже $_SERVER['DOCUMENT_ROOT']есть свои проблемы ... например, может быть не установлен или настроен правильно и так далее. Есть и другие способы, которыми я могу придумать, чтобы справиться с этим ... У каждого свои предостережения. Очень весело :)
Адам
1
Это решение было хорошо объяснено и работало точно так, как нужно после того, как WP выдавал ошибку «не определено». Спасибо;)
Крис Спраг
-1

Я использую home_url () для ссылки на домашнюю страницу WP. Иногда site_url () может не быть вашим home_url () . Вы можете определить специальную страницу как домашнюю страницу в Wordpress.

mdikici
источник