Что использовать вместо 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 просто ошибочен?
Nick
(Меня конкретно интересует получение полного пути к установленным плагинам, кроме того плагина, который содержит мой собственный код, на случай если это поможет прояснить вопрос.)
Nick
Возвращает серверный путь к текущей директории плагина:
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;