Existe um limite para enganchar a prioridade?

8

Quando eu desejar que meu gancho de filtro ou 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 ligar a 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 por PHP_MAX_INT

    
por shea 09.01.2013 / 10:41

5 respostas

12

Não há limites nem penalidades de desempenho. Para entender por que, você precisa entender como todos os ganchos são armazenados no ecossistema WP.

Primeiro de tudo, você precisa entender onde todos os ganchos são armazenados e como eles fazem isso. Todos os ganchos para filtros e ações são armazenados na variável global chamada wp_filter , sim, sim ganchos de ação também são armazenados nessa variável. Esta variável é array associado, onde key é o nome da ação ou filter e value é outro array associativo. Por exemplo, vamos dar uma olhada na ação 'init', nesse estágio veremos a seguinte estrutura:

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

Esta sub-matriz possui chaves numéricas e valores como matrizes. Chaves numéricas são nossas prioridades. Matrizes, associadas a chaves numéricas, contêm uma lista de ganchos com a mesma prioridade. Portanto, se chamarmos add_action( 'init', 'wpse8170_my_first_init', 20 ) , ligue para add_action( 'init', 'wpse8170_my_second_init', 20 ) e, finalmente, chamaremos add_action( 'init', 'wpse8170_my_third_init', 10 ) , nosso exemplo será:

$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 init action for acionada, todos os ganchos serão classificados com o uso de ksort e nossa matriz parece 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' .

Então você pode ver que não há limites e penalidades e você pode usar qualquer valor que seja aceitável como uma chave para o array associado pelo seu ambiente PHP.

    
por Eugene Manuilov 09.01.2013 / 11:34
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.

Editar: sem penalidade no desempenho, é um número inteiro.

Mas ... sério? :)

    
por webaware 09.01.2013 / 10:50
0

Sem limite e sem penalidade de desempenho. Ao inspecionar o código, você pode até usar strings como prioridades, embora eu não recomende fazer isso;)

Se sua ação tiver que ser a última, você poderá inspecionar as propriedades atribuídas examinando os índices do $wp_actions[your hook] global quando sua ação for chamada e adicioná-la novamente com prioridade mais alta, se necessário, mas não consigo ver razão para realmente fazer esse tipo de coisa.

    
por Mark Kaplun 09.01.2013 / 11:04
0

Não há "praticamente" nenhum limite, pois os ganchos são 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 - que apenas se traduz em um índice numérico na matriz onde as funções conectadas são armazenadas - não deve travar o wordpress.

    
por WP Themes 09.01.2013 / 12:00
0

@shea - As ações do WordPress funcionam exatamente da maneira OPOSTA que você imaginou. Um valor de prioridade mais alto NÃO substituirá os outros, e o uso de PHP_INT_MAX NÃO é uma tentativa "extrema" de forçar essa ação / filtro a ser executada antes de qualquer outro.

Para colocar sua ação / filtro no TOPO da ordem de execução, você precisa usar uma prioridade de 0.

PHP_INT_MAX está simplesmente no lado oposto; é usado quando você quer que sua ação / filtro seja executada APÓS todos os outros ganchos (prioridade normal) serem concluídos.

    
por Andy Schmidt 12.03.2018 / 23:44

Tags