Примечание. Этот ответ только для того, чтобы облегчить обсуждение между @scribu и @kaiser. Моды: пожалуйста, не удаляйте. Пользователи / Читатели: Пожалуйста, не голосуйте. Если вы хотите следить за обсуждением, посмотрите журнал изменений / редактирования. Если вы хотите присоединиться к обсуждению, отредактируйте ответ. Если обсуждение имеет результат, то оно будет помечено как таковое. Спасибо.
Сценарии
Существуют также разные сценарии, которые имеют разный вес, где вы можете иметь зависимость от плагина. (Примеры только вымышленные). Слово «(родительский) плагин» можно заменить на «тему» с родительской точки зрения.
- (сложно) Дочерний плагин, который только расширяет функциональность или изменяет отображение (и аналогичное) существующего плагина и поэтому не может существовать без родителя. Пример: BuddyPress »BuddyPress-FunkyCommentDisplay
- (обычный) Плагин, который имеет расширенные функциональные возможности при активации дочернего плагина. Пример: jQueryAttachmentCarousel »jQuerySlideDeck
- (мягкий) Плагин, который просто добавляет функцию. Пример: DisneyWonderlandTheme »MickeysSocialLinks
Далее я попытаюсь набросать, что происходит, когда вы обновляете «другой» плагин и проверка больше не работает.
- Объявление 1) Плагин не может существовать без активации BuddyPress »Материал полностью сломан.
- Объявление 2) Плагин не может предложить вариант переключения с карусели на SlideDeck »Отображает проводной (я предполагаю, что стили изменены на SlideDeck).
- Объявление 3) MickeysSocialLinks исчезают.
Проверьте
Есть три возможности проверить, если вы хотите знать, активен ли плагин:
- A. Папка существует?
- B. Существует ли основной файл - опция
'active_plugins'
- существует?
- C. Существует ли конкретная функция?
Если я сейчас возьму свой плагин Internal Link Checker в качестве примера, который не предлагает общедоступный API и не предназначен для расширения, то я бы не увидел причин (как автора) не изменять именование внутренних функций по требованию или только по желанию , Так что, если кто-то попытается использовать этот плагин, он просто сломается (в зависимости от функциональности и жесткости комплектации) при обновлении. То же самое касается имен файлов. У меня не было бы реальной причины (кроме того, что плагин будет деактивирован при обновлении), чтобы не изменять имя файла. Единственное, что могло бы удержать меня от изменения имени папки, - это то, что проверка обновлений и уведомление выполняются для имени файла - если оно размещено в официальном репозитории.
Поэтому я бы сказал, что от самой слабой (легко изменяемой) до самой жесткой (много говорят против изменения) части (родительского) плагина будет:
функция »имя основного файла» папка
Когда я сказал, что проверка функции менее хрупкая, чем использование, is_plugin_active()
я предположил, что рассматриваемая функция - это та, которую явно поддерживает автор плагина. Конечным примером этого будет wp_pagenavi()
тег шаблона, предлагаемый плагином WP-PageNavi.
Сложность в определении зависимостей заключается в том, что не существует стандартного способа уникальной идентификации плагинов, который не включает имена файлов.
Больше мыслей на эту тему:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme
Я думаю, мы можем подвести итог в трех пунктах:
- Мы говорили о немного разных темах
- Мы согласны с тем, что нет пуленепробиваемого способа обойти то, что я думал, что тема будет
- Исходя из вашего понимания вопроса, вы предложили правильный путь
(Пока) самый умный способ, который я могу придумать, который я уже видел в некоторых (слишком много) плагинах:
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
Не думая слишком подробно об этом, но я думаю, вы могли бы подключить свое уведомление к проверке «все» фильтра и проверить внутри текущего фильтра, если он был запущен, когда вы находитесь на shutdown
крючке ...?
Использование хуков хорошо работает для «нормальных» и «слабых» зависимостей. Единственным недостатком является то, что вам все равно придется использовать function_exists()
или is_plugin_active()
если вы хотите остановить, если зависимость не встречается. Использование фильтра «все» для этого было бы слишком дорого IMO.
@scibu Это было нацелено на "вашу" тему. (Я уже бросил говорить о моем). :)
Так что, в принципе, если вам нужна зависимость - и у вас есть хороший автор - тогда он может предложить вместо этого хук в качестве замены тега шаблона. Потому что плагин будет подключаться к нему только в том случае, если он будет присутствовать или просто ничего не делать. А с другой стороны у вас не будет ошибки, когда плагины отсутствуют.
Вот трудная часть (или более Q): Чтобы написать уведомление администратора для информирования пользователя о зависимости «Вам нужно установить» DisneyWonderLinks «», вы можете проверить array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
. Я не уверен, что это будет работать, но на самом деле массив должен быть доступен с обеих сторон (public / admin).
Это не сработает. Тот факт, что обратный вызов зарегистрирован для ловушки, не означает, что ловушка будет срабатывать, когда ожидается. Единственная вещь, которая могла бы работать подобным образом, - это использовать хук 'shutdown', о котором вы упоминали ранее:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
Конечно, это будет напечатано в самом низу, после </html>
тега, во внешнем интерфейсе (поскольку там обычно используются теги шаблонов), что не очень полезно.
Вы можете попытаться сохранить сообщение в wp_options, а затем отобразить его в административной области, но это откроет совершенно новую банку червей: аннулирование, плагины для кэширования и т. Д.
function_exists
, то обычный пользователь просто получит сообщение, что он не установил плагин, на который полагается другой плагин. Проблема заключается в том , что пользователь действительно будет установлен плагин , а затем просто интересно , почему это doens't работы . О, и я не собираюсь понижать тебя за это.