Примітка. Ця відповідь якраз тут, щоб полегшити обговорення між @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-dependitions-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()
якщо ви хочете припинити, якщо залежність не дотримана. Використання фільтра "все" для цього буде занадто дорогим ІМО.
@scibu Це було націлене на "вашу" тему. (Я вже відмовився говорити про своє). :)
Отже, якщо вам потрібна залежність - і у вас є хороший автор - тоді він може запропонувати гачок замість / як заміну тегу шаблону. Тому що плагін зачепить його лише тоді, коли гак буде присутній, або просто нічого не робити. А з іншого боку, ви б не мали помилки, якщо плагінів немає.
Ось складна частина (або більше Q): Щоб написати адміністраторське повідомлення, щоб повідомити користувача про залежність "Вам потрібно встановити" DisneyWonderLinks «", ви можете перевірити це array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
. Я не впевнений, чи спрацювало б це, але масив afaik повинен бути доступний для обох (public / admin) сторін.
Це б не спрацювало. Тільки тому, що зворотний виклик зареєстровано на гачок, не означає, що гак буде спрацьовувати, коли очікується. Єдине, що націлило б на роботу, це використання гачка "відключення", про який ви згадали раніше:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
Звичайно, це буде надруковано в самому низу, після </html>
тегу, на передній частині (оскільки там зазвичай використовуються теги шаблонів), що не приносить великої користі.
Ви можете спробувати зберегти повідомлення в wp_options, а потім відобразити його в області адміністрування, але це відкрило б цілком нову банку черв'яків: недійсність, кешування плагінів тощо.
function_exists
, звичайний користувач просто отримає повідомлення про те, що він не встановив плагін, на який покладається інший плагін. Проблема полягає в тому , що користувач дійсно буде встановлено плагін , а потім просто цікаво , чому це doens't роботи . О, і я не збираюсь вас проти цього.