Quando desejo que meu filtro ou gancho de ação substitua todos os outros, atribuirei a ele uma prioridade de 999
. No entanto, ultimamente, tenho visto algumas pessoas usarem valores extremos para a prioridade, como 20000
e até99999
Além do fato de que usar prioridades tão altas é ridículo, elas realmente funcionam? Existe um limite para obter prioridade? O que acontecerá se o limite for excedido? Existe uma diferença de desempenho ao usar prioridades extremas?
Atualização: @harke sugere no Stack Overflow que o número é limitado porPHP_INT_MAX
Respostas:
Não há limites nem penalidades de desempenho. Para entender o porquê, você precisa entender como todos os ganchos são armazenados no ecossistema WP.
Antes de tudo, você precisa entender onde todos os ganchos estão armazenados e como eles o fazem. Todos os ganchos para filtros e ações são armazenados na variável global chamada
wp_filter
, sim sim, os ganchos de ação também são armazenados nessa variável. Essa variável é uma matriz associada, em que key é o nome da ação ou filtro e o valor é outra matriz associativa. Por exemplo, vamos dar uma olhada na ação 'init'; neste estágio, veremos a seguinte estrutura:Essa sub-matriz possui chaves e valores numéricos como matrizes. Chaves numéricas são nossas prioridades. Matrizes, associadas a teclas numéricas, contêm uma lista de ganchos com a mesma prioridade. Portanto, se ligarmos
add_action( 'init', 'wpse8170_my_first_init', 20 )
, ligaradd_action( 'init', 'wpse8170_my_second_init', 20 )
e finalmente ligaradd_action( 'init', 'wpse8170_my_third_init', 10 )
, nosso exemplo será semelhante a:Agora, quando a
init
ação é acionada, todos os ganchos serão classificados com o uso daksort
função e nossa matriz ficará agora:E todos os ganchos serão executados nesta fila: primeiro
'wpse8170_my_third_init'
, depois'wpse8170_my_first_init'
e finalmente'wpse8170_my_second_init'
.Portanto, você pode ver que não há limites e penalidades e pode usar qualquer valor que seja aceitável como chave para a matriz associada pelo seu ambiente PHP.
fonte
max( $priorities ) + 1
falhará se o último número for igual aPHP_INT_MAX
. Nesse caso, você deve converter o valor em uma string e adicionar algo a ela.$wp_filter
sempre mude. Não é para ser usado diretamente por plugins. Fizemos modificações no passado (principalmente por razões de desempenho, aliás).É um número inteiro; portanto, em um sistema PHP de 32 bits, ele será limitado a -2147483648 a 2147483647 e, no PHP de 64 bits, será limitado a -9223372036854775808 a 9223372036854775807.
Edit: sem penalidade de desempenho, é um número inteiro.
Mas seriamente? :)
fonte
@shea - as ações do WordPress funcionam exatamente da maneira OPOSTA que você assumiu. Uma figura de prioridade mais alta NÃO substituirá outras, e o uso do PHP_INT_MAX NÃO é uma tentativa "extrema" de forçar essa ação / filtro a ser executada antes de outras.
Para colocar sua ação / filtro no topo da ordem de execução, você precisará usar a prioridade 0.
PHP_INT_MAX está simplesmente no extremo oposto; é usado quando você deseja que sua ação / filtro seja executada APÓS todos os outros ganchos (prioridade normal) terem sido concluídos.
fonte
$priority
, portanto, retornos de chamada associados a prioridade0
não estarão necessariamente no topo da ordem de execução.Sem limite e não há penalidade de desempenho. Ao inspecionar o código, você pode até usar seqüências de caracteres como prioridades, embora eu não recomendo fazer isso;)
Se sua ação tiver que ser a última, você poderá inspecionar as prioridades atribuídas observando os índices globais
$wp_actions[your hook]
quando sua ação for chamada e adicioná-la novamente com maior prioridade, se necessário, mas não vejo uma razão para realmente fazer esse tipo. das coisas.fonte
"Praticamente" não há limite, pois os ganchos são realmente armazenados como matrizes e a prioridade é o índice numérico.
Mas, na realidade, o tamanho da matriz será limitado pela quantidade de memória alocada para a execução do script.
Então, eu acho que definir um número de prioridade ridiculamente grande - o que apenas se traduz em um índice numérico no array em que as funções ligadas são armazenadas - não deve travar o wordpress.
fonte