Existe um limite para obter prioridade?

9

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 20000e 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

shea
fonte
Você não apontou para uma resposta de @hakre que falou sobre isso? Deve ser parte do Q, e mais, seguir o exemplo que deu, eu suspeito que ele sabe a sério uma ou duas coisas ...
brasofilo
A que resposta você está se referindo?
shea

Respostas:

13

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:

$wp_filter = array(
    'init' => array(...),
);

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 ), ligar add_action( 'init', 'wpse8170_my_second_init', 20 )e finalmente ligar add_action( 'init', 'wpse8170_my_third_init', 10 ), nosso exemplo será semelhante a:

$wp_filter = array(
    'init' => array(
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
    ),
);

Agora, quando a initação é acionada, todos os ganchos serão classificados com o uso da ksortfunção e nossa matriz ficará agora:

    array(
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
    ),

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.

Eugene Manuilov
fonte
2
max( $priorities ) + 1falhará se o último número for igual a PHP_INT_MAX. Nesse caso, você deve converter o valor em uma string e adicionar algo a ela.
fuxia
@toscho Sim, concordo. Atualizado o snippet de bônus.
Eugene Manuilov
2
O "bônus" é uma má idéia, caso a definição para $wp_filtersempre mude. Não é para ser usado diretamente por plugins. Fizemos modificações no passado (principalmente por razões de desempenho, aliás).
Andrew Nacin
@AndrewNacin ok, eu removi-lo, uma vez que provoca muitas perguntas :)
Eugene Manuilov
6

É 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? :)

webaware
fonte
Eu entendo que é um número inteiro, mas eu estava falando sobre o mecanismo de gancho real. Já ouvi pessoas dizerem que ter um gancho muito grande fará com que o gancho falhe completamente, e o retorno de chamada não será executado
Shea
Quem? Quando? É apenas um índice em uma matriz e uma matriz esparsa, portanto, há um impacto insignificante. Mas, honestamente, grandes números são praticamente um indicador de não entender um problema (por exemplo, tentar freneticamente qualquer coisa que possa dar certo!)
webaware
1

@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.

Andy Schmidt
fonte
11
Sim, essa é exatamente a ideia. O filtro final que é executado em um gancho será capaz de modificar a variável sem se preocupar com quaisquer outras alterações
karité
Valores inteiros negativos também podem ser usados $priority, portanto, retornos de chamada associados a prioridade 0não estarão necessariamente no topo da ordem de execução.
Dave Romsey
0

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.

Mark Kaplun
fonte
0

"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.

Temas WP
fonte