На каком приоритете add_filter перезаписывает основные функции?
Я пишу плагин, который добавляет дополнительные миниатюры, флажки и т.д. в конец записи.
Я пытаюсь разобраться, как правильно использовать add_filter.
В основном, у меня есть
add_filter('the_content', 'do_some_magic_at_the_end');
И есть соответствующая функция do_some_magic_at_the_end, которая принимает $content и добавляет к нему некоторый контент.
Я хочу, чтобы этот фильтр добавлялся после всех остальных фильтров. Я не хочу, чтобы он перезаписывал какие-либо другие фильтры. В документации говорится, что приоритет по умолчанию равен 10, поэтому я предполагаю, что он просто добавляется в цепочку фильтров, которые выполняются для the_content.
Если я установлю приоритет 1, это перезапишет какие-либо основные функции?

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

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

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

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

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