Когда я хочу, чтобы мой фильтр или ловушка действий переопределяли все остальные, я назначаю ему приоритет 999
. Однако в последнее время я вижу, что некоторые люди используют экстремальные значения для приоритета, такие как 20000
, и даже99999
Помимо того, что использование таких высоких приоритетов смешно, будут ли они работать на самом деле? Есть ли предел для перехвата приоритета? Что произойдет, если предел будет превышен? Есть ли разница в производительности при использовании экстремальных приоритетов?
Обновление: @harke предлагает при переполнении стека число ограниченоPHP_INT_MAX
Ответы:
Там нет ограничений и никаких штрафов за производительность. Чтобы понять почему, вам нужно понять, как все хуки хранятся в экосистеме WP.
Прежде всего вам необходимо понять, где хранятся все хуки и как они это делают. Все хуки для фильтров и действий хранятся в глобальной переменной с именем
wp_filter
да, хуки действий тоже хранятся в этой переменной. Эта переменная представляет собой связанный массив, где ключ - это имя действия или фильтра, а значение - другой ассоциативный массив. Например, давайте посмотрим на действие 'init', на этом этапе мы увидим следующую структуру:Этот подмассив имеет числовые ключи и значения в виде массивов. Цифровые клавиши являются нашими приоритетами. Массивы, связанные с числовыми ключами, содержат список хуков с одинаковым приоритетом. Так что если мы позвоним
add_action( 'init', 'wpse8170_my_first_init', 20 )
, то позвонимadd_action( 'init', 'wpse8170_my_second_init', 20 )
и наконец позвонимadd_action( 'init', 'wpse8170_my_third_init', 10 )
, наш пример будет выглядеть так:Теперь, когда
init
действие запущено, все хуки будут отсортированы с использованиемksort
функции, и наш массив теперь выглядит так:И все хуки будут выполняться в этой очереди: сначала
'wpse8170_my_third_init'
, потом'wpse8170_my_first_init'
и наконец'wpse8170_my_second_init'
.Таким образом, вы можете видеть, что нет никаких ограничений и штрафов, и вы можете использовать любое значение, которое приемлемо в качестве ключа для связанного массива вашей средой PHP.
источник
max( $priorities ) + 1
потерпит неудачу, если последний номер равенPHP_INT_MAX
. В этом случае вы должны преобразовать значение в строку и добавить что-то к ней.$wp_filter
навсегда изменится. Он не предназначен для использования непосредственно плагинами. Мы делали модификации в прошлом (в первую очередь по соображениям производительности, кстати).Это целое число, поэтому в 32-битной системе PHP оно будет ограничено от -2147483648 до 2147483647, а в 64-битной версии PHP оно будет ограничено от -9223372036854775808 до 9223372036854775807.
Изменить: без потери производительности, это целое число.
Но серьезно? :)
источник
@shea - действия WordPress работают именно так, как вы предполагали. Показатель с более высоким приоритетом НЕ будет переопределять другие, и использование PHP_INT_MAX НЕ является какой-то «экстремальной» попыткой принудительно запустить это действие / фильтр перед любыми другими.
Чтобы поместить ваше действие / фильтр в ТОП ордера выполнения, вам нужно использовать приоритет 0.
PHP_INT_MAX просто на противоположном конце; он используется, когда вы хотите, чтобы ваше действие / фильтр запускалось ПОСЛЕ того, как все остальные (нормальные приоритеты) ловушки завершены.
источник
$priority
, поэтому обратные вызовы, перехваченные с приоритетом0
, не обязательно будут в верхней части порядка выполнения.Нет ограничений и нет штрафа за производительность. Из проверки кода вы даже можете использовать строки в качестве приоритетов, хотя я бы не рекомендовал делать это;)
Если ваше действие должно быть последним, то вы можете проверить назначенные приоритеты, просматривая индексы глобала,
$wp_actions[your hook]
когда вызывается ваше действие, и добавлять его снова с более высоким приоритетом, если это необходимо, но я не вижу причины для такого рода действий вещей.источник
Здесь практически нет ограничений, так как хуки фактически хранятся в виде массивов, а приоритет - числовой индекс.
Но на самом деле размер массива будет ограничен объемом памяти, выделенной для выполнения скрипта.
Итак, я полагаю, что установка смехотворно большого числа приоритета - который просто переводится в числовой индекс в массиве, где хранятся перехваченные функции - не должна приводить к падению wordpress.
источник