Melhor maneira de flush_rewrite_rules para o tipo de post personalizado, em um plugin mu-plugins?

9

Estou escrevendo um plug-in que instancia um tipo de postagem personalizado (entre outras coisas). É um plugin multisite e vive no diretório mu-plugins .

Qual é a melhor prática para lidar com flush_rewrite_rules () nessa situação? Para um plug-in 'normal', você faria isso em um gancho de ativação - o que não seria possível para um plug-in de uso obrigatório, já que esses ganchos não estão disponíveis.

Como é suposto ser um evento "one time" depois de registrar o tipo de postagem personalizado, faria sentido fazer algo assim em minha classe que registrasse o CPT:

private function check_flush_my_CPT() {
    global $wp_rewrite;
    if ( !get_option('my_plugin_firstrun') ) {
        $wp_rewrite->init();
        $wp_rewrite->flush_rules(true);
        update_option('my_plugin_firstrun', 'yes');
    }
}

public function register_my_CPT() {
   // do all the CPT setup steps for the $args array...  

   register_post_type('my_CPT', $args);
   $this->check_flush_my_CPT();
}

add_action( 'init', array(&$this, 'register_my_CPT' ) );

Assim, o registro CPT acontece em todas as ações 'init' - mas se eu tiver esse direito, as regras de reescrita flush só acontecem uma vez. Sempre .

Estou no caminho certo?

(edit): Eu apenas tentei; meu CPT está dando um erro 404 não encontrado, então as regras de reescrita não estão funcionando: - (

(edit # 2): Eu tentei a solução para acessar a variável global, como mostrado nesta pergunta: Como liberar regras de reescrita em multisite? - atualizarei meu exemplo de código acima para mostrar isso. Infelizmente ainda estou recebendo erro 404 ao tentar carregar um CPT. Eu vejo que as regras de reescrita estão sendo armazenadas no banco de dados, parece que eles não estão sendo usados. Estou perdido.

    
por C C 28.11.2015 / 05:16

2 respostas

2

A função flush_rewrite_rules é confiável em alguns contextos, como um tema ou um plug-in baseado em ganchos, mas não tenho certeza se funciona para mu-plugin

Minha declaração é baseada no fato de que o WordPress é inicializado desta maneira:

  • chame o arquivo wp-settings.php
  • chame o gancho do_action( 'muplugins_loaded' ); , aqui seu plug-in foi inicializado
  • chame $GLOBALS['wp_rewrite'] = new WP_Rewrite(); aqui o método flush_rules está inicializado e disponível a partir de agora
  • do_action( 'setup_theme' ); é chamado e eu aposto todo o meu dinheiro que neste gancho o flush_rewrite_rules funcionará

Solução?

Pessoalmente, acho confiável a exclusão da opção rewrite_rules.

delete_option('rewrite_rules');

ou

update_option('rewrite_rules', '' );

Sempre que o WordPress não tiver o rewrite_rules , ele será construído de volta, e também o método flush_rules .

Existem pontos no fluxo de execução do WordPress onde funções como esta não estão disponíveis. mesmo no núcleo do WordPress eu encontrei esta afirmação

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

O único problema seria o desempenho, não faça isso em todas as solicitações porque é um processo difícil de reconstruí-las. Como eu posso ver, você quer liberá-los apenas na primeira chamada e isso é bom.

PS: Eu não sou um fã de autopromoção, mas também escrevi um artigo sobre isso há muito tempo e eu acho que ainda aguenta isso

    
por Andrei 03.08.2016 / 13:54
0

Se o seu plugin mu tem opções eu colocaria o flush logo após atualizá-las:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
    
por Leon Francis Shelhamer 04.02.2016 / 05:04