jim
  • 0
Новичок

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

  • 0

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

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

В принципе, у меня есть

add_filter('the_content', 'do_some_magic_at_the_end');

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

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

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

Share
  1. На этот вопрос нет однозначного ответа, потому что нет предела для высоких/низких приоритетов. Также плагины могут быть гораздо менее осторожны с этим, чем ядро.

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

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

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

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

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

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

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

    • 0

Оставить ответ

You must login to add an answer.