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? Напишіть у коментарях: ми читаємо кожен.