На каком приоритете add_filter перезаписывает основные функции?

23 сент. 2010 г., 07:16:36
Просмотры: 22.2K
Голосов: 7

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

Я пытаюсь разобраться, как правильно использовать add_filter.

В основном, у меня есть

add_filter('the_content', 'do_some_magic_at_the_end');

И есть соответствующая функция do_some_magic_at_the_end, которая принимает $content и добавляет к нему некоторый контент.

Я хочу, чтобы этот фильтр добавлялся после всех остальных фильтров. Я не хочу, чтобы он перезаписывал какие-либо другие фильтры. В документации говорится, что приоритет по умолчанию равен 10, поэтому я предполагаю, что он просто добавляется в цепочку фильтров, которые выполняются для the_content.

Если я установлю приоритет 1, это перезапишет какие-либо основные функции?

0
Все ответы на вопрос 2
2
22

Однозначного ответа на этот вопрос нет, потому что нет ограничений на высокие/низкие приоритеты. Кроме того, плагины могут быть гораздо менее внимательными к этому, чем ядро.

  • 11 — хорошее число, чтобы быть после стандартного приоритета;
  • 20 — чтобы быть позже;
  • несколько тысяч — хороший вариант, чтобы быть позже всех, кто не добавил больше нулей в свои тысячи;
  • 9 — хорошее число, чтобы быть чуть раньше стандартного;
  • 1 — чтобы быть действительно рано;
  • -1 — чтобы быть почти гарантированно первым, потому что очень мало людей помнят, что приоритеты могут быть отрицательными.

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

А если вы делаете плагин для распространения, вы можете только предполагать, но не быть уверенным.

23 сент. 2010 г. 08:16:16
Комментарии

(Очень неэффективный) способ убедиться, что ваш фильтр выполняется последним, это подключиться к действию all, где вы можете проверить массив $wp_filter и добавить свой фильтр с самым поздним приоритетом. Технически это гарантирует результат, но оно того не стоит. Также можно использовать PHP_INT_MAX в качестве приоритета.

Jan Fabry Jan Fabry
23 сент. 2010 г. 11:04:22

Хорошее замечание насчёт all, но я бы не использовал его таким образом. Действительно ужасно неэффективно. Что касается максимального значения - я бы тоже не впадал в крайности... Приоритет хранится как ключ массива, который PHP может интерпретировать и как целое число, и как строку. Использование крайних значений может привести к проблемам.

Rarst Rarst
23 сент. 2010 г. 11:20:39
2

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

18 дек. 2012 г. 22:06:56
Комментарии

вы ошибаетесь в этом

User User
13 сент. 2019 г. 02:11:48

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

GigiSan GigiSan
30 окт. 2020 г. 16:11:49