Задание
Вы можете зарегистрироваться и добавить дополнительные каталоги тем, используя register_theme_directory()
для вашей установки WP. К сожалению, ядро не предоставляет такую же функциональность для плагинов. У нас уже есть MU-плагин, Drop-Ins, плагины и темы. Но нам нужно больше для лучшей организации файлов.
Вот список задач для достижения:
- Добавить дополнительный каталог плагинов
- Для каждого каталога плагинов необходима новая «вкладка», как показано здесь [1]
- Дополнительный каталог будет иметь ту же функциональность, что и каталог плагинов по умолчанию.
Что там для тебя?
Лучший и самый полный ответ будет награжден за вознаграждение.
[1] Дополнительная вкладка для новой папки / каталога плагинов
get_themes()
в класс.Ответы:
Ладно, я попробую. Некоторые ограничения, с которыми я столкнулся на этом пути:
В подклассах WP_List_Table не так много фильтров, по крайней мере, там, где они нам нужны.
Из-за отсутствия фильтров мы не можем поддерживать точный список типов плагинов в верхней части.
Мы также должны использовать некоторые замечательные (читай: грязные) хаки JavaScript для отображения плагинов как активных.
Я обернул свой код области администратора внутри класса, поэтому имена моих функций не имеют префикса. Вы можете увидеть весь этот код здесь . Пожалуйста, внесите свой вклад!
Центральный API
Просто простая функция, которая устанавливает глобальную переменную, которая будет содержать наши каталоги плагинов в ассоциативном массиве. Будет
$key
использоваться для извлечения плагинов и т. Д.$dir
- это либо полный путь, либо что-то относительноwp-content
каталога.$label
будет для нашего отображения в области администратора (например, переводимая строка).Тогда, конечно, нам нужно загрузить плагины. Задержитесь
plugins_loaded
поздно и пройдитесь по активным плагинам, загружая каждый.Административная зона
Давайте настроим нашу функциональность внутри класса.
Мы собираемся подключиться
plugins_loaded
очень рано и настроить разрешенные «действия», которые мы будем использовать. Они будут обрабатывать активацию и деактивацию плагинов, поскольку встроенные функции не могут делать это с пользовательскими каталогами.Тогда есть функция, подключенная в
load-plugins.php
. Это делает все виды забавных вещей.Давайте пройдемся по одной вещи за раз.
get_plugins
метод является оберткой другой функции. Он заполняет атрибутplugins
данными.cd_apd_get_plugins
это рип из встроеннойget_plugins
функции без хардкодаWP_CONTENT_DIR
иplugins
бизнеса. В основном: получить каталог из$wp_plugin_directories
глобального, открыть его, найти все файлы плагинов. Храните их в кеше на потом.Следующим шагом является надоедливый бизнес по фактической активации и деактивации плагинов. Для этого мы используем
handle_actions
метод. Это, опять-таки, явно сорвано с вершиныwp-admin/plugins.php
файла ядра .Пара пользовательских функций здесь снова.
cd_apd_activate_plugin
(сорвал сactivate_plugin
) иcd_apd_deactivate_plugins
(сорвал сdeactivate_plugins
). Оба они такие же, как их соответствующие «родительские» функции без жестко закодированных каталогов.И функция деактивации
Есть также
cd_apd_validate_plugin
функция, которая, конечно же, является отрывомvalidate_plugin
без жестко закодированного барахла.Хорошо, с этим из пути. Мы действительно можем начать говорить об отображении таблицы списка
Шаг 1: добавьте наши представления в список в верхней части таблицы. Это делается путем фильтрации
views_{$screen->id}
внутри нашейinit
функции.Тогда фактическая подключенная функция просто проходит через
$wp_plugin_directories
. Если в одном из недавно зарегистрированных каталогов есть плагины, мы добавим его на экран.Первое, что нам нужно сделать, если мы просматриваем пользовательскую страницу каталога плагинов, это снова отфильтровать представления. Нам нужно избавиться от
inactive
счета, потому что он не будет точным. Следствием этого является отсутствие фильтров там, где они нам нужны. Подцепить снова ...И быстрый сброс
Далее, давайте избавимся от плагинов, которые вы в противном случае видели бы в таблице списка, и замените их нашими пользовательскими плагинами. Крюк в
all_plugins
.Поскольку мы уже настроили наши плагины и данные (см.
setup_plugins
Выше),filter_plugins
метод just (1) сохраняет счетчик для всех плагинов для последующего использования, а (2) заменяет плагины в таблице списка.А теперь мы убьем массовые действия. Полагаю, их легко можно поддержать?
Ссылки на действия плагина по умолчанию не будут работать для нас. Поэтому вместо этого нам нужно настроить свои собственные (с настраиваемыми действиями и т. Д.). В
init
функции.Единственное, что здесь изменилось: (1) мы меняем действия, (2) сохраняем статус плагина и (3) немного меняем одноразовые имена.
И, наконец, нам просто нужно поставить в очередь немного JavaScript, чтобы завершить его. В
init
функции снова (все вместе на этот раз).При постановке в очередь нашего JS, мы также будем использовать,
wp_localize_script
чтобы получить значение общего количества «всех плагинов».И, конечно же, JS - это всего лишь несколько приятных хаков, чтобы заставить список таблиц активных / неактивных плагинов правильно отображаться. Мы также добавим правильное количество всех плагинов обратно в
All
ссылку.Заворачивать
Фактическая загрузка дополнительных каталогов плагинов довольно неинтересна. Получение таблицы списка для правильного отображения является более сложной частью. Я до сих пор не совсем доволен тем, как это получилось, но, возможно, кто-то может улучшить код
источник
__return_empty_array()
.__return_empty_array
функцию!Лично я не заинтересован в изменении пользовательского интерфейса, но мне бы хотелось иметь более организованную структуру файловой системы по нескольким причинам.
Для этого другим подходом будет использование символических ссылок.
Вы можете настроить свои собственные плагины
plugins-custom
, которые могут быть частью репозитория управления версиями вашего проекта.Затем вы можете установить сторонние зависимости в
plugins-external
(через Composer, или субмодули Git, или что вы предпочитаете).Тогда у вас может быть простой скрипт Bash или команда WP-CLI, которая сканирует дополнительные каталоги и создает символическую ссылку
plugins
для каждой найденной подпапки.plugins
все равно будет загроможден, но это не будет иметь значения, потому что вам нужно будет только взаимодействовать сplugins-custom
иplugins-external
.Масштабирование до
n
дополнительных каталогов будет следовать тому же процессу, что и первые два.источник
Или вы также можете использовать COMPOSER с настраиваемым путем к каталогу, указывающим на папку wp-content. Если это не прямой ответ на ваш вопрос, это новый способ мышления WordPress, перейдите к композитору, прежде чем он съест вас.
источник