Skip to content
🛠 2 способа получить корневой путь WordPress

🛠 2 способа получить корневой путь WordPress

Подключаете файл в functions.php, и WordPress не может его найти. Знакомо? Причина почти всегда в неверном пути к корневой папке.

Прописанный вручную /var/www/html/ ломается при переезде на другой сервер. А жёстко зашитый ../../wp-content/plugins/ перестаёт работать при смене структуры каталогов. К счастью, WordPress даёт два штатных способа узнать абсолютный путь к корню сайта, без единой догадки. Оба работают с трейлинг-слешем из коробки, так что конкатенация подпутей не требует лишнего /.

К концу поста вы будете точно знать, когда брать get_home_path(), а когда ABSPATH, и почему в одних проектах они совпадают, а в других возвращают разные каталоги. Бонусом разберём типовую ошибку с двойным слешем и сценарий для внешних cron-скриптов.

💡 Быстрый обзор:

  • Откройте functions.php темы и подключите wp-admin/includes/file.php, после этого вызывайте get_home_path() для получения абсолютного пути с трейлинг-слешем
  • Используйте константу ABSPATH из wp-config.php, она доступна глобально, не требует ручного подключения и работает даже на фронте
  • При нестандартной структуре каталогов (Bedrock, вынесенное ядро) сравните вывод обоих методов на тестовом сервере, они могут указывать на разные папки
  • Для плагинов и тем, распространяемых через каталог WordPress.org, берите ABSPATH, это стандарт, который гарантированно работает на любом хостинге

Характеристика

get_home_path()

ABSPATH

Где определён

wp-admin/includes/file.php

wp-config.php

Доступность

Только в админке / после require_once

Глобально

Трейлинг-слеш

Всегда есть /

Всегда есть /

Совпадают ли

В стандартной установке - да

В стандартной установке - да

Когда различаются

Ядро вынесено из корня документов

Bedrock, кастомная структура

1. get_home_path(): путь через API админки

Функция get_home_path() описана в официальной документации WordPress и возвращает абсолютный файловый путь к корню установки, тому каталогу, где лежат wp-admin, wp-includes и wp-content. В отличие от ручного прописывания, она не зависит от хостинга и не ломается при переезде.

Главное преимущество: вам не нужно гадать, развёрнут сайт в корне домена или в подкаталоге. Функция сама разберётся и вернёт, например, /var/www/html/ для стандартной установки или /home/user/site.com/wordpress/ для сайта в подпапке. Никаких ../../ и ручной правки конфигов.

Файл с функцией находится в wp-admin/includes/file.php, поэтому напрямую в теме или на фронте get_home_path() недоступна. Чтобы использовать её за пределами админки, сначала подключите файл вручную. Код добавляется в functions.php дочерней темы или через плагин Code Snippets:

1// Подключаем файл с функцией — без неё get_home_path() вызовет фатальную ошибку
2require_once ABSPATH . 'wp-admin/includes/file.php';
3
4// Получаем абсолютный путь к корню WordPress
5$root = get_home_path();
6
7// Пример: подключаем файл update.php из wp-admin
8require_once $root . 'wp-admin/update.php';

Здесь require_once с путём через ABSPATH загружает административный файл только один раз, повторное подключение не вызовет конфликта. После этого get_home_path() доступна в любом месте темы.

Обратите внимание: трейлинг-слеш уже включён в возвращаемую строку. Конкатенируйте подпути без дополнительного / в начале: $root . 'wp-admin/update.php', а не $root . '/wp-admin/update.php'. Двойной слеш PHP молча проглотит на большинстве файловых систем, но некоторые строгие проверки file_exists() могут споткнуться.

2. ABSPATH: константа прямо из wp-config.php

ABSPATH — это константа, которую WordPress определяет в wp-config.php при загрузке. В стандартном файле она выглядит так:

1if (!defined('ABSPATH')) {
2 define('ABSPATH', __DIR__ . '/');
3}

__DIR__ возвращает каталог, где лежит сам wp-config.php, а это и есть корень WordPress. Константа доступна глобально: в теме, плагинах, на фронте, в админке, в WP-CLI. Никаких require_once для подгрузки, она уже в памяти с момента старта ядра.

Использование тривиально, подставьте ABSPATH везде, где требуется абсолютный путь:

1// Сохраняем путь в переменную для читаемости
2$rootPath = ABSPATH;
3
4// Подключаем файл из wp-admin
5require_once ABSPATH . 'wp-admin/update.php';
6
7// Или загружаем пользовательский файл из корня
8include_once ABSPATH . 'custom-cron.php';

Трейлинг-слеш здесь тоже присутствует, поведение идентично get_home_path(). Паттерн require_once ABSPATH . 'wp-admin/update.php' будет работать на любом хостинге, в любой структуре каталогов, без единой правки пути. Именно поэтому большинство плагинов из каталога WordPress.org используют ABSPATH, а не get_home_path(): константа не требует ручного подключения файла и не зависит от контекста вызова.

Когда get_home_path() и ABSPATH выдают разные каталоги

В стандартной установке WordPress обе конструкции возвращают одну и ту же строку. Но есть два сценария, где они расходятся, и если вы о них не знаете, баг может прожить в коде месяцами.

Ядро вынесено из корня документов. Некоторые хостинги (Kinsta, WP Engine) и кастомные сборки размещают файлы ядра в отдельной директории, а wp-config.php, на уровень выше. В этом случае ABSPATH указывает на папку с wp-config.php, а get_home_path(), на подкаталог с ядром. На WordPress StackExchange разработчики приводят реальный пример: ABSPATH = /www/site/, а get_home_path() = /www/site/wp/. Разница в один каталог, и require_once падает с фатальной ошибкой.

Bedrock и другие нестандартные структуры. В Bedrock от Roots корень сайта (web/wp/) отделён от корня проекта, где лежат config/, vendor/ и web/. ABSPATH в Bedrock указывает на web/wp/, тогда как get_home_path() сориентируется по настройкам мультисайта и домашнему URL. На практике get_home_path() в Bedrock может вернуть путь к web/wp/, совпадающий с ABSPATH, но полагаться на это не стоит, проверьте на конкретном проекте.

Практический вывод: если пишете плагин для публикации в каталог WordPress.org, используйте ABSPATH, он доступен везде без дополнительных подключений. Если пишете код для конкретного сайта с нестандартной структурой, проверьте обе константы на тестовом окружении и возьмите ту, которая указывает туда, куда нужно именно вам. Пять минут сравнения на тестовом сервере сэкономят часы отладки на проде.

Есть ещё один нюанс с темой: если ваша тема распространяется на Themeforest или в каталоге WordPress.org, всегда используйте ABSPATH, он гарантированно определён на любом хостинге клиента. get_home_path() может не сработать, если тема вызывает его до загрузки админки.

Короткое видео выше наглядно показывает, как ABSPATH защищает плагины от прямого запуска и почему паттерн defined('ABSPATH') or die, стандарт безопасности для любого PHP-файла в экосистеме WordPress.

⁉️🤔 Частые вопросы

Что быстрее: get_home_path() или ABSPATH?

ABSPATH — это константа: её значение определено один раз при загрузке WordPress и хранится в памяти. get_home_path(), функция, которая при первом вызове парсит домашний URL и вычисляет путь относительно файловой системы. Разница в скорости исчезающе мала (микросекунды на вызов), но если путь запрашивается десятки раз за один HTTP-запрос, сохраните ABSPATH в переменную в начале скрипта и используйте её.

Нужно ли вручную подключать ABSPATH в своих файлах?

Если ваш код выполняется в контексте WordPress (тема, плагин, AJAX-обработчик), ABSPATH уже определён, подключать ничего не нужно. Проверка if (!defined('ABSPATH')) { exit; } в начале произвольного PHP-файла в корне сайта, хорошая практика безопасности: она блокирует прямой запуск скрипта в обход WordPress и защищает от утечки данных через прямой HTTP-запрос к файлу.

Можно ли использовать ABSPATH во внешнем cron-скрипте?

Можно, но с осторожностью. Если скрипт лежит за пределами установки WordPress, загрузите wp-load.php: require_once '/path/to/wp-load.php';. После этого ABSPATH станет доступен. Учтите: прямой вызов wp-load.php загружает всё ядро и все активные плагины, для частых cron-задач это избыточно. Для высоконагруженных проектов лучше вынести логику в WP-CLI команду.

get_home_path() возвращает путь с двойным слешем?

Нет. Функция гарантированно возвращает один трейлинг-слеш. Двойной слеш может появиться, только если вы сами добавите / в начале подпути: get_home_path() . '/wp-admin/'. Правильно без стартового слеша: get_home_path() . 'wp-admin/'. На большинстве Linux-систем двойной слеш эквивалентен одинарному, но полагаться на это не стоит, проверки file_exists() на некоторых конфигурациях могут вернуть false.

Чем корневой путь отличается от home URL?

Корневой путь (/var/www/html/) — это файловая система сервера. Home URL (https://site.com) — это адрес, который видит браузер. Для получения URL используйте home_url(), а для файлового пути: get_home_path() или ABSPATH. Не путайте: require_once ждёт файловый путь, wp_remote_get() ждёт URL. Перепутаете, получите либо false из file_exists(), либо битый HTTP-запрос к локальному пути.

Что использовать в вашем проекте: итоговый расклад

Для абсолютного большинства задач хватает ABSPATH. Константа доступна сразу после загрузки WordPress, не требует ручного подключения файлов и работает одинаково на любом хостинге. Если вы пишете плагин или тему для распространения, только ABSPATH, без вариантов.

Если администрируете сайт с нестандартной структурой каталогов (вынесенное ядро, Bedrock, мультисайт с разными домашними URL), потратьте пять минут и сравните вывод get_home_path() и ABSPATH на тестовом окружении. Расхождение в один каталог может стоить часов отладки на проде.

А какой метод используете вы, get_home_path() или ABSPATH? Напишите в комментариях: мы читаем каждый.