Что использовать вместо WP_CONTENT_DIR и WP_PLUGIN_DIR?
Документация WordPress по Определению директорий плагинов и контента утверждает следующее:
WordPress использует следующие константы для определения путей к директориям контента и плагинов. Они не должны использоваться напрямую плагинами или темами, но перечислены здесь для полноты информации.
Далее в списке упоминаются WP_CONTENT_DIR
и WP_PLUGIN_DIR
среди констант, которые не должны использоваться разработчиками тем и плагинов, предположительно по этой причине:
WordPress позволяет пользователям размещать директорию wp-content где угодно, поэтому вы не должны предполагать, что плагины будут находиться в wp-content/plugins, загрузки — в wp-content/uploads, а темы — в wp-content/themes.
Марк Жакит также отмечает здесь, что эти константы не следует использовать:
Не используйте WP_PLUGIN_URL или WP_PLUGIN_DIR — плагины могут находиться не в директории plugins.
Так какой же принятый способ ссылаться на полный путь к папкам плагинов, wp-content и тем без использования этих констант?
В качестве простого примера, для вывода полного пути всех установленных плагинов я могу сделать так:
<?php
$plugins = get_plugins();
foreach ($plugins as $file => $details) {
echo WP_PLUGIN_DIR . '/' . $file . '<br>';
}
Что даст список вроде этого:
/var/www/wp-content/plugins/akismet/akismet.php
/var/www/wp-content/plugins/debug-bar/debug-bar.php
/var/www/wp-content/plugins/hello.php
(Это может быть полезно, например, если я пишу плагин для выборочного архивирования плагинов при создании резервной копии сайта.)
Если использование WP_PLUGIN_DIR
неправильно, какое существует альтернативное решение? Я не нашел эквивалента функции wp_upload_dir()
для папок плагинов, тем и wp-content, что делает проблематичным определение корневых директорий тем и плагинов, которые могут находиться в разных местах.

Ссылка на файл в текущем пути или во вложенной директории
Для ссылки на текущий путь используйте:
plugin_dir_path( __FILE__ )."further/nesting/here.css";
Это работает в плагинах и темах.
Ссылка на URL/URI в плагине
Для указания на файл в плагине или теме используйте:
plugins_url( "path/to/file", __FILE__ );
Это работает только в плагинах
Ссылка на URL/URI в папке wp-admin
Всегда указывайте их через admin_url( 'some/path' );
. Также существует get_admin_url()
.
Ссылка на URL/URI в папке wp-includes
Используйте includes_url( 'some/path' );
URL/URI относительно домашней страницы сайта
Для этого есть home_url( 'etc' );
или get_home_url()
. Аналогично работают get_site_url()
и site_url()
. Также существует network_home_url()
. И ещё есть network_admin_url()
Папка wp-content
или переименованная директория
Вы можете переопределить имя папки wp-content
. Для этого используйте content_url()
.
Как получить URL папки плагинов?
Если использование WP_PLUGIN_DIR неправильно, какой вариант рекомендуется?
Просто используйте plugins_url()
без параметров.
Если вы используете это для плагина, это работает и для MU-плагинов.
РЕДАКЦИЯ #1 Если вам нужен путь к текущему плагину, используйте plugin_basename();
.
РЕДАКЦИЯ #2 Если вас интересуют все активные плагины в сети, используйте wp_get_active_network_plugins();
.
Если у вас не мультисайт, воспользуйтесь wp_get_active_and_valid_plugins();
. Это учитывает мультисайт/сеть. Имейте в виду, что это будет учитывать их, даже если у вас не мультисайт, но есть дропин sunrise.php
.
Вы можете также получить их через get_option( 'active_plugins' );
, что не рекомендуется, так как не учитывает фильтры и валидацию плагинов, которые происходят в различных случаях.
Дополнительное чтение
Этот список можно продолжать и продолжать. Посмотрите результаты поиска на QueryPosts.com для получения дополнительной информации.
Эта статья подробно рассказывает абсолютно обо всех путях.

Спасибо за ответ, но он касается URL-адресов, а не абсолютных путей на сервере, что меня и интересовало. Например, plugins_url()
возвращает URL к папке плагинов, а не полный путь к директории на сервере. Существуют ли аналогичные функции для работы с директориями, о которых я не знаю? Или совет не использовать константу WP_PLUGIN_DIR
просто ошибочен?

(Меня конкретно интересует получение полного пути к установленным плагинам, кроме того плагина, который содержит мой собственный код, на случай если это поможет прояснить вопрос.)

Возвращает серверный путь к текущей директории плагина:
plugin_dir_path(__FILE__) // пример: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/
Ссылка: https://codex.wordpress.org/Function_Reference/plugin_dir_path
Не путать с:
plugins_dir_path(__FILE__)
(Обратите внимание на множественное число "plugins").
Так как нам не нужно имя директории плагина, мы должны его удалить. Вот функция, которая возвращает директорию плагина и имя файла:
plugin_basename(__FILE__) // пример: exampleplugin/exampleplugin.php
Но нам также не нужно имя файла плагина, поэтому сначала удалим его из
plugin_basename(__FILE__)
. Чтобы вернуть имя файла плагина:basename(__FILE__) // пример: exampleplugin.php
Чтобы использовать это для построения пути к директории plugins, мы можем использовать функцию
str_replace()
следующим образом:$myBnm = basename(__FILE__); // значение: exampleplugin.php $myDir = plugin_basename(__FILE__); // значение: exampleplugin/exampleplugin.php $myStr = str_replace($myBnm,"",$myDir); // значение: exampleplugin/ $myPth = plugin_dir_path(__FILE__); // значение: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/ return str_replace($myStr,"",$myPth); // возвращает: /home/myserver/public_html/wordpress_install/wp-content/plugins/
При необходимости, последнюю строку можно присвоить переменной для повторного использования.
Вместо:
return str_replace($myStr,"",$myPth); // возвращает: /home/myserver/public_html/wordpress_install/wp-content/plugins/
Используйте что-то вроде:
$thePlgDir = str_replace($myStr,"",$myPth); // возвращает: /home/myserver/public_html/wordpress_install/wp-content/plugins/
И позже, когда потребуется:
return $thePlgDir;
