Por que todo mundo prende o add_rewrite_rule no init?

4

Cada exemplo que vejo ao adicionar regras rewrtie parece

function addsomerule() {
  add_rewrite_rule(some regex,some parse result);
}

add_action('init','addsomerule');

Isso não computa para mim. como adições para reescrever regras desse tipo estão sendo ignoradas se a opção rewrite_rule não estiver vazia (ou seja, não havia regras de reescrita niveladas agora), então qual é o sentido de conectá-la lá?

Parece que associar isso em admin_init faz muito mais sentido, já que as gravações no banco de dados e, portanto, reescrever o flush, devem acontecer apenas no lado do administrador.

Não há uma ação mais lógica para usar essa função ou é o init ou o filtro de nível inferior?

    
por Mark Kaplun 05.11.2015 / 15:03

1 resposta

5

Você está certo ao dizer que sem regras de liberação, add_rewrite_rule() não funciona, e o motivo é que o WordPress busca regras do banco de dados, e add_rewrite_rule() não adiciona a regra ao banco de dados. / p>

No entanto, não é possível usar admin_init , e a razão é que admin_init é tarde demais.

O WordPress às vezes chama flush_rewrite_rules() nas telas de administração antes que admin_init seja disparado (por exemplo, aqui ), e para ter certeza de que a regra é adicionada quando o WordPress chama flush_rewrite_rules() , você precisa usar init (ou talvez wp_loaded ).

Algo parecido com isso poderia funcionar:

function addsomerule() {
  if ( is_admin() ) add_rewrite_rule(some regex,some parse result);
}

add_action( 'init','addsomerule' );

Isso garante que a regra seja adicionada somente durante solicitações de administrador.

No entanto, a instrução if que chama uma função vem com um (pequeno) custo em termos de desempenho e considerando que o add_rewrite_rule não é muito caro (ele grava apenas um valor em uma matriz global e não não acertar db), então provavelmente não vale a pena adicionar essa condição.

Além disso, nem sempre você tem controle sobre todo o código usado pelo site. Se o algum plug-in chamar flush_rewrite_rules() em solicitações front-end, sua regra será perdida porque adicionada somente no back-end.

Por todas estas razões, adicionar regras de reescrita em init sem qualquer outro teste é provavelmente a coisa certa a fazer: evita qualquer problema e os pequenos custos que ele acrescenta em solicitações frontend são praticamente irrelevantes e perdidos na inicialização do WordPress tempo.

    
por gmazzap 05.11.2015 / 17:00