Подключение к хукам в других плагинах

14 авг. 2010 г., 22:10:22
Просмотры: 3.23K
Голосов: 12

Я работаю над плагином, который должен выполнять определённые действия, когда пользователь что-то делает через другой плагин.

Я могу добавить собственные хуки в эти плагины, но очевидно, что это плохо подходит для случаев, когда я хочу распространять свой плагин. Есть ли хороший способ добавлять хуки к чужим плагинам из моего собственного плагина? Единственное реальное решение — просить автора добавить кастомные хуки, чтобы другие разработчики могли расширять его функционал?

Пример: я хочу выполнить что-то в своём плагине, когда кто-то ретвитит статью. Если бы в популярном плагине для ретвитов был кастомный хук, к которому я мог бы подключиться — это было бы идеально. Но его нет, поэтому я могу модифицировать их плагин, чтобы добавить его, но это будет работать только в моей копии, а я не хочу пытаться распространять изменённую версию.

Неужели единственное решение — просто стараться быть более сознательными разработчиками плагинов, чтобы мы все могли нормально работать вместе?

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

Отличный вопрос!

MikeSchinkel MikeSchinkel
15 авг. 2010 г. 00:45:27

"Единственное реальное решение — попросить автора добавить пользовательские хуки, чтобы другие разработчики могли расширять его работу?" В большинстве случаев — да. Бывают ситуации, когда можно косвенно подключиться к их плагину, но обычно это не так. Скажите им, чтобы они писали свои плагины так, как если бы писали для ядра WordPress — добавляйте фильтры/действия везде, где они могут понадобиться.

Viper007Bond Viper007Bond
15 авг. 2010 г. 04:50:05

Подсказка: Документируйте хуки, которые предоставляет ваш плагин, чтобы другие авторы плагинов могли с ним взаимодействовать.

hakre hakre
17 авг. 2010 г. 14:37:13
Все ответы на вопрос 4
0

@Ryan Elkins:

Думаю, ответ зависит от того, насколько важен для вас каждый конкретный случай использования. В одних ситуациях вам может потребоваться быстрое и простое решение, в других — более основательный подход. Вот два варианта, которые приходят на ум:

Поиск альтернативных хуков в ядре WordPress

Если вам нужно быстрое решение, иногда можно использовать другие хуки из ядра WordPress для внесения необходимых изменений, либо комбинировать хуки до и после с помощью функций ob_start()/ob_end_clean() (см. ответ @Todd Perkins на вопрос "Работа с большим HTML-выводом через код плагина" для примера кода).

Для поиска подходящих хуков вы можете использовать плагин Instrument Hooks, который я опубликовал вчера — он поможет вам найти хуки, которые потенциально можно задействовать.

Отправка патча с нужным хуком разработчику плагина

Если ваш случай использования более важен для вас или сообщества, я рекомендую добавить необходимый хук прямо в плагин. Тщательно протестируйте его, чтобы убедиться, что он действительно решает вашу задачу, а затем отправьте патч разработчику плагина в надежде, что он его применит. Таким образом, вы максимально упростите ему задачу, предоставив готовый протестированный код, и сами убедитесь в правильности решения. Я много раз сталкивался с ситуацией, когда думал, что мне нужен определенный хук, но в процессе реализации понимал, что требуется несколько иной подход.

Если вы не знакомы с созданием патчей, вот хорошая статья о патчинге ядра WordPress (большая часть информации применима и к плагинам, а оставшиеся моменты, надеюсь, будут очевидны):

Надеюсь, это поможет?

P.S. Меня немного огорчает (и ваш вопрос это подчеркивает), какой процент плагинов разрабатывается только для конечных пользователей — без каких-либо хуков для разработчиков. Представьте, если бы WordPress был спроектирован как большинство плагинов — он был бы негибким и очень нишевым решением.

Возможно, ситуация изменилась бы, если бы WordPress умел автоматически устанавливать плагины, от которых зависят другие плагины? Сейчас мне часто приходится писать нужную функциональность с нуля, потому что клиенты хотят определенных вещей, а доступные плагины, хоть и покрывают 90% потребностей, не дают гибкости для настройки оставшихся 10%.

Я действительно хотел бы, чтобы лидеры сообщества WordPress нашли способ поощрять плагины, которые следуют лучшим практикам (например, добавляют хуки для разработчиков), подобно тому, как поощряются хорошие ответы на сайтах StackExchange.

15 авг. 2010 г. 00:45:10
0

Достаточно ли просто попытаться и стать лучшими разработчиками плагинов, чтобы мы могли дружно работать вместе?

Для начала, да.

Единственное реальное решение — это попросить автора добавить пользовательские хуки, чтобы другие разработчики могли расширять его работу?

Это было бы хорошим решением.

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

14 авг. 2010 г. 22:37:32
3

Думаю, вы сами ответили на свой вопрос, сделав его несколько риторическим.

Очевидно, вы говорите о системе, похожей на ту, что Google продвигает в Android с помощью Intent, где приложение может публиковать действия, которые оно способно выполнять для других приложений, а те, в свою очередь, могут подключаться к ним и обмениваться данными. Лично я считаю, что нам, как хорошим разработчикам, стоит двигаться в этом направлении — мы используем WordPress, потому что он уже потрясающий, настолько, что в большинстве случаев выбор между ним и разработкой собственного решения становится очевидным. То же самое с репозиторием плагинов — зачем разрабатывать свой Twitter-плагин, если уже есть отличный готовый вариант?

В основе вашего вопроса лежит идея «зачем дублировать функционал?». Система Intent в Android позволяет приложениям использовать уже созданные функции и обмениваться данными, и она популярна именно потому, что активно продвигается. В WordPress уже есть похожая система, но она редко используется за пределами хуков в основном коде, которые, впрочем, применяются очень часто.

Сообществу было бы полезно, если бы в кастомных плагинах было больше хуков, но, как вы правильно заметили, нет простого способа добавлять их там, где они нужны.

Что касается Twitter-плагина, в который вы хотите интегрироваться, — напишите его автору. Уверен, он с радостью добавит нужные вам хуки.

Если в вашем плагине есть место, куда, по вашему мнению, можно добавить хук, — сделайте это и хорошо задокументируйте. Если больше разработчиков начнут добавлять хуки в свои плагины или если сообщество начнет активнее продвигать эту идею, это рано или поздно станет стандартом.

Итак, отвечая на ваш заключительный вопрос:

Нужно ли нам просто становиться лучшими разработчиками плагинов, чтобы лучше взаимодействовать друг с другом?

Да.


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

14 авг. 2010 г. 22:44:39
Комментарии

Это сработает, но что если функция другого плагина будет иметь такое же имя?

Arlen Beiler Arlen Beiler
14 авг. 2010 г. 22:59:42

Ой, возможно нет, потому что нужно знать, что именно ретвитят и кто это делает. Проверка функции - это решение во время выполнения, а нам нужно решение в реальном времени, которое срабатывает при вызове функции или возврате данных.

Arlen Beiler Arlen Beiler
14 авг. 2010 г. 23:01:42

@Arlen - Допустим, ты создашь свою функцию, которая проверяет наличие конкретной функции. Она будет запускаться после 'plugins_loaded', и если функция существует, установит булево значение, включающее функционал. Это сильно зависит от неизменности кода, но я не вижу причин, почему это не сработает?

nobody nobody
15 авг. 2010 г. 00:03:50
3

определить функцию:

function my_footer() {
    do_action('my_footer');
}

теперь вы можете подключиться к этому хуку: add_action('my_footer', 'example_function', 1);# подробнее смотрите в моей статье.

14 авг. 2010 г. 22:35:01
Комментарии

not => now, this own => this. Верно?

Arlen Beiler Arlen Beiler
14 авг. 2010 г. 22:40:25

Я понимаю, как добавлять свои хуки - вопрос в том, как подключиться к хуку чужого плагина, желательно без необходимости прямого изменения их плагина.

Ryan Elkins Ryan Elkins
14 авг. 2010 г. 22:41:51

@Arlen: большое спасибо, извините за мой плохой английский

@Ryan: это невозможно, если плагин не имеет хука; но вы можете попробовать заменить функцию или класс, если автор плагина предусмотрел такую возможность. Однако можно проверить активные плагины и подключить хук раньше в WP, чем другой плагин, чтобы заменить его функцию.

bueltge bueltge
15 авг. 2010 г. 00:47:55