Я пишу плагин, который добавляет дополнительные миниатюры, флажки и т. д. в конец сообщения.
Я пытаюсь понять, как правильно использовать add_filter.
В принципе, у меня есть
add_filter('the_content', 'do_some_magic_at_the_end');
И есть соответствующая функция do_some_magic_at_the_end, которая берет $content и добавляет к нему кое-что.
Я хочу, чтобы этот фильтр добавлялся после всех остальных фильтров. Я не хочу, чтобы он перезаписывал любой другой фильтр. В документах указано, что приоритет по умолчанию равен 10, поэтому я предполагаю, что он просто добавляется в цепочку фильтров, которые запускаются для the_content.
Если я установлю приоритет равным 1, будут ли перезаписаны какие-либо основные функции?
На этот вопрос нет однозначного ответа, потому что нет предела для высоких/низких приоритетов. Также плагины могут быть гораздо менее осторожны с этим, чем ядро.
В целом, если вы хотите быть уверены, что вы находитесь перед другими функциями, вам придется сбросить все, что добавлено, чтобы подключить вашу конкретную настройку и отладить ее. Возможно, вам потребуется создать функцию-оболочку, чтобы добавить свои фильтры на определенном этапе загрузки или даже переместить другие фильтры.
И если вы делаете плагин для распространения, вы можете догадаться, но не можете быть уверены.
(Очень неэффективный) способ убедиться, что ваш фильтр работает последним, — это подключиться к
all
действию, где вы можете проверить$wp_filter
массив и добавить свой фильтр с последним приоритетом. Так что технически вы можете быть уверены, но оно того не стоит. Вы также можете использоватьPHP_INT_MAX
в качестве приоритета.Хороший вопрос
all
, но я бы не использовал его таким образом. Действительно ужасно неэффективно. Что касается max, я бы тоже не стал впадать в крайности… Приоритет хранится в виде ключа массива, который может интерпретироваться PHP как целое число, так и строка. Переход к крайним случаям может взорвать.ты ошибаешься в этом
Просто чтобы добавить дополнительное пояснение, это частично правильно, а частично неправильно. На самом деле вы не перезаписываете основное поведение; вы либо изменить его до или после. В любом случае, все фильтры по определению запускаются последовательно, поэтому рано или поздно все фильтры выполняются ровно один раз и по одному за раз, включая основные, если они существуют. Из: Источник, который я цитирую: функции с одинаковым приоритетом выполняются в том порядке, в котором они были добавлены в действие.
Вы ничего не перезапишете. Каждый уровень приоритета на самом деле представляет собой список фильтров для использования. Если у вас есть несколько разных вещей, подключенных к одному и тому же фильтру с одинаковым приоритетом, они все будут запущены.