Что я должен использовать вместо WP_CONTENT_DIR и WP_PLUGIN_DIR?

15

Документация WordPress для определения плагинов и каталогов контента гласит:

WordPress использует следующие константы при определении пути к каталогам содержимого и плагинов. Они не должны использоваться непосредственно плагинами или темами , но перечислены здесь для полноты.

Далее следует перечислить WP_CONTENT_DIRи WP_PLUGIN_DIRсреди констант, которые разработчики тем и плагинов не должны использовать, предположительно из-за этого:

WordPress позволяет пользователям размещать свои каталоги wp-контента в любом месте, поэтому они никогда не должны предполагать, что плагины будут в wp-content / plugins, или что загрузки будут в wp-content / uploads, или что темы будут в wp- содержание / тема.

Марк Джакит также комментирует здесь, что эти константы не должны использоваться:

Не используйте WP_PLUGIN_URL или WP_PLUGIN_DIR - плагины могут отсутствовать в каталоге плагинов.

Итак, каков приемлемый способ ссылки на полный путь к папкам с плагинами, wp-контентом и темами без использования этих констант?

В качестве простого примера, чтобы вывести полный путь всех установленных плагинов, я могу сделать это:

<?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, которые я могу найти, что делает проблематичным обращение к потенциально блуждающим темам и корневым каталогам плагинов.

Ник
источник
Взгляните на статью Кодекса « Определение плагинов и каталогов содержимого» .
Чарльз Кларксон
2
@CharlesClarkson Я ссылаюсь на эту страницу в первом предложении моего вопроса. Он говорит не использовать вышеупомянутые константы, но не предлагает альтернативу таким вещам, как WP_PLUGIN_DIR, следовательно, мой вопрос здесь.
Ник

Ответы:

17

Ссылочный файл в текущем пути или более глубокий вложенный

Для ссылки на текущий путь

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 для получения дополнительной информации.

Эта статья идет в абсолютных глубинах обо всех путях.

кайзер
источник
3
Спасибо за это, но ваш ответ, похоже, касается URL-адресов, а не абсолютных путей к серверу, что меня и заинтересовало. Например, plugins_url()возвращает URL-адрес папки плагинов, а не полный путь к каталогу на сервере. Существуют ли похожие функции для работы с каталогами, о которых я не знаю? Или совет не использовать WP_PLUGIN_DIRконстанту просто неправильно?
Ник
(Я особенно заинтересован в том, чтобы найти полный путь к установленным плагинам, кроме плагина, который содержит мой собственный код, на случай, если это поможет объяснить.)
Ник
@ Ник Смотрите обновление.
Кайзер
Статья, которая «подробно рассказывает обо всех плагинах», больше не доступна. И я до сих пор не могу понять, как получить абсолютный путь к каталогу плагинов без использования WP_PLUGIN_DIR.
XedinUnknown
4
  1. Это возвращает путь к каталогу текущего каталога плагина:

    plugin_dir_path(__FILE__)
    
    // example: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/

    Ссылка: https://codex.wordpress.org/Function_Reference/plugin_dir_path

    Не путать с:

    plugins_dir_path(__FILE__)

    (Обратите внимание на множественное число «плагин s » на этом.)

  2. Поскольку вы не хотите, чтобы имя каталога плагинов возвращалось, мы должны удалить его. Вот функция, которая возвращает каталог плагина и имя файла:

    plugin_basename(__FILE__)
    
    // example: exampleplugin/exampleplugin.php
  3. Но, конечно же, нам также не нужно имя файла плагина, поэтому нам нужно удалить его plugin_basename(__FILE__)сначала. Чтобы вернуть имя файла плагина:

    basename(__FILE__)
    
    // example: exampleplugin.php
  4. Таким образом, чтобы использовать их для создания пути к каталогу плагинов , мы можем использовать str_replace()функцию примерно так:

    $myBnm = basename(__FILE__); // value: exampleplugin.php
    $myDir = plugin_basename(__FILE__); // value: exampleplugin/exampleplugin.php
    $myStr = str_replace($myBnm,"",$myDir); // value: exampleplugin/
    $myPth = plugin_dir_path(__FILE__); // value: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/
    return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/
  5. И если необходимо, эту последнюю строку, конечно, можно присвоить переменной для повторного использования.

    Вместо того:

    return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/

    Используйте что-то вроде:

    $thePlgDir = str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/

    И позже, когда это необходимо:

    return $thePlgDir;
Джо Рони
источник