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

16 окт. 2013 г., 15:10:44
Просмотры: 19K
Голосов: 23

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

3
Комментарии

Ознакомьтесь со статьёй в Codex: Определение директорий плагинов и контента.

Charles Clarkson Charles Clarkson
16 окт. 2013 г. 21:10:05

@CharlesClarkson Я ссылаюсь на эту страницу в первом предложении моего вопроса. Там говорится не использовать указанные константы, но не предлагается альтернативы таким вещам как WP_PLUGIN_DIR, поэтому я задал вопрос здесь.

Nick Nick
16 окт. 2013 г. 22:58:27
Все ответы на вопрос 2
4
23

Ссылка на файл в текущем пути или во вложенной директории

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

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

Эта статья подробно рассказывает абсолютно обо всех путях.

16 окт. 2013 г. 17:49:14
Комментарии

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

Nick Nick
16 окт. 2013 г. 17:58:15

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

Nick Nick
16 окт. 2013 г. 18:00:13

@Nick Смотрите обновление.

kaiser kaiser
16 окт. 2013 г. 18:09:06

Статья, которая "подробно рассказывает обо всех плагинах", больше не доступна. И я до сих пор не могу понять, как получить абсолютный путь к директории плагинов без использования WP_PLUGIN_DIR.

XedinUnknown XedinUnknown
18 апр. 2019 г. 14:34:01
0
  1. Возвращает серверный путь к текущей директории плагина:

    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").

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

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

    basename(__FILE__)
    
    // пример: exampleplugin.php
    
  4. Чтобы использовать это для построения пути к директории 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/
    
  5. При необходимости, последнюю строку можно присвоить переменной для повторного использования.

    Вместо:

    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;
    
24 июн. 2015 г. 06:20:30