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.
Respostas:
A
flush_rewrite_rules
funçã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:
wp-settings.php
arquivodo_action( 'muplugins_loaded' );
gancho, aqui seu plugin é inicializado$GLOBALS['wp_rewrite'] = new WP_Rewrite();
aqui o métodoflush_rules
é inicializado e disponível a partir de agorado_action( 'setup_theme' );
é chamado e eu aposto todo o meu dinheiro que neste ganchoflush_rewrite_rules
funcionaráSolução?
Pessoalmente, acho confiável a exclusão da opção rewrite_rules.
ou
Sempre que o WordPress faltar,
rewrite_rules
ele será construído de volta, também é isso que oflush_rules
mé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
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.
fonte
Se o seu mu-plugin tiver opções, eu colocaria o flush logo após atualizá-las:
fonte