A melhor maneira de flush_rewrite_rules para o tipo de postagem personalizada, em um plug-in mu-plugins?

9

Estou escrevendo um plugin 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 será possível para um plug-in obrigatório, pois esses ganchos não estão disponíveis.

Como esse deveria ser um evento "único" depois de registrar o tipo de postagem personalizado, faria sentido fazer algo assim na minha classe que registra 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' ) );

Portanto, o registro do CPT acontece em todas as ações 'init' - mas se eu tiver esse direito, as regras de reescrita liberadas acontecem apenas uma vez. Ever .

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): Tentei a solução para acessar a variável global, como mostrado nesta pergunta: Como liberar com segurança regras de reescrita em multisite? - Vou atualizar meu exemplo de código acima para mostrar isso. Infelizmente ainda estou recebendo o erro 404 ao tentar carregar um CPT. Vejo que as regras de reescrita estão sendo armazenadas no banco de dados, parece que elas não estão sendo usadas. Estou perdido.

CC
fonte
Realmente não há maneira adequada de fazer isso. Este é basicamente o melhor no momento de escrever este comentário.
Pieter Goosen
@ PieterGoosen - obrigado, eu vi isso anteriormente e atualizei minha pergunta para considerar a outra solução. Ainda não funciona. Gostaria de saber se eu quebrei algo executando flush_rewrite_rules () antes de ver a outra resposta? Talvez eu precise excluir meu site de teste e restabelecê-lo, para testar com precisão o procedimento correto?
CC
Isso pode ser possível. A execução incorreta de regras de reescrita de descarga em um multisite pode quebrar todas as regras de reescrita em sua rede. Se eu estivesse onde você, eu começaria de novo. Esperança apenas é esta uma instalação local acabam não um site ao vivo ;-)
Pieter Goosen
certo ... vou tentar isso. E não, é um site de teste e acho que posso acabar com o banco de dados e redefinir a configuração de rede enquanto durmo! :-)
CC

Respostas:

2

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

Minha afirmação é baseada no fato de o WordPress ser inicializado desta maneira:

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

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 faltar, rewrite_rulesele será construído de volta, também é isso que o flush_rulesmétodo faz.

Há pontos no fluxo de execução do WordPress em que funções como essa não estão disponíveis. mesmo no núcleo do WordPress, 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, pois é um processo difícil construí-las de volta. Como posso ver, você deseja liberá-los apenas na primeira chamada e isso é uma coisa boa.

PS: Eu não sou tão fã de promoções, mas também escrevi um artigo sobre isso há muito tempo e acho que ainda é válido.

Andrei
fonte
0

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

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
Leon Francis Shelhamer
fonte