Estou tendo um problema estranho com as regras de reescrita que não estão funcionando corretamente.
Eu tentei usar flush_rewrite_rules();
e flush_rewrite_rules(true);
.
Eu também tentei globalizar $wp_rewrite
usando $wp_rewrite->flush_rules();
e$wp_rewrite->flush_rules(true);
Nenhum dos quais parece estar liberando as regras de reescrita corretamente. Essas chamadas estão realmente liberando as regras de reescrita quando chamadas. Como eu sei disso? Usando a solução para depuração, reescreva a liberação da regra .
Atualmente, reescrevi regras liberadas na ativação e desativação de plug-ins. Não há problemas lá.
Eu tenho uma página de configurações de administração do plug-in para os usuários configurarem o plug-in. Algumas das configurações ajustam a estrutura do link permanente, portanto, as regras de reescrita precisam ser liberadas na página de configurações de administração do plug-in "Salvar configurações". (Usa o padrão update_option();
) para salvar as configurações.
Gostaria de observar que, dependendo das configurações especificadas, tipos de postagem personalizados são criados para corresponder às configurações especificadas pelo usuário. Portanto, as regras de reescrita devem ser liberadas imediatamente após as configurações serem salvas. É aqui que as coisas não estão funcionando adequadamente.
A solução de link acima para depurar regras de reescrita fornecidas por @toscho
está exibindo que está liberando toneladas de regras de reescrita. No entanto, ao visitar o item singular de tipo de postagem personalizado, ou mesmo o archive de tipo de postagem personalizado, cada um deles retorna como erros 404.
O tipo de postagem personalizada é registrado corretamente e apropriadamente. Sei com certeza que não é esse o problema.
Imediatamente após a configuração da página de administração do plug-in, salve. Os tipos de postagem personalizados são criados, a estrutura do link permanente é ajustada e todas as regras de reescrita tentam ser liberadas.
Os tipos de postagem personalizados são carregados sempre e carregados init
normalmente.
Por algum motivo, as regras de reescrita não estão funcionando corretamente, porque, como eu disse antes, visitar seções singulares ou de arquivamento do tipo de postagem personalizada retorna erros 404.
Agora, a parte estranha, se tudo o que faço é simplesmente visitar a página de configurações de administração de links permanentes e, em seguida, voltar ao front-end para exibir seções singulares ou de arquivo do tipo de postagem personalizada, elas funcionam magicamente conforme o esperado.
O que essa página de configurações de permalinks de administração faz que eu não estou fazendo para permitir que as regras de reescrita sejam niveladas adequadamente e as minhas não?
Quero dizer, como uma solução temporária, redireciono o usuário para a página de configurações de permalinks de administração depois de salvar a página de configurações de administração do plug-in, mas essa não é uma solução ideal. Eu preferiria que as regras de reescrita apenas nivelassem corretamente no código do meu plug-in.
Existe um certo ponto no WordPress em que a liberação das regras de reescrita simplesmente não libera TODAS as regras?
admin_menu
- A página de configurações do plug-in é adicionada à administração do WordPress.
add_options_page()
- A página de configurações do plug-in é adicionada no menu Configurações.
A página de configurações é renderizada no retorno de chamada para add_options_page()
. Também é aqui que $_POST
é processado a atualização das configurações do plug-in e a liberação das regras de reescrita.
Como essa já é uma pergunta longa, eu estaria disposto a fornecer blocos de código (se ajudar) em um link externo que ajudasse a produzir uma resposta válida.
fonte
flush_rewrite_rules
, o que exclui arewrite_rules
opção e a regenera, você pode abrir o arquivowp-admin/options-permalinks.php
e ver onde isso acontece. como essa operação exclui toda a opção, não é possível liberar parcialmente as regras.init
qual registra os tipos de postagem. Imaginei que as configurações da página estavam sendo salvas e a página seria recarregada ... depois acionando oinit
gancho novamente para registrar os tipos de postagem necessários. Então, imaginei que os tipos de postagem já seriam carregados, e tudo que eu precisava fazer era atualizar a opção e liberar as regras de reescrita na página de configurações do plug-in. Vou postar uma resposta de como descobri uma solução.Respostas:
O melhor lugar para liberar regras de reescrita é na ativação / desativação de plug-in.
Veja o artigo do codex
Pedimos desculpas antecipadamente, mas não respondi completamente à sua pergunta. Portanto, essa é uma resposta um pouco complicada.
fonte
Difícil dizer o que há de errado, sem ver seu código. Mas, depois de salvar algumas configurações, é prático conectar-se
admin_init
como mostrado abaixo para liberar suas regras de reescrita.Código:
Você precisa definir a opção em algum lugar na página de configurações ou para ser exato em algum lugar no processo de salvar as configurações. Fazer isso sem a opção é ruim, porque você não deseja liberar as regras todas as vezes.
Nota: não testado
fonte
*_option()
causa da página de configurações. @helgathevikingEu tinha um arquivo de classe de tipos de postagem responsável por ler as configurações de opções do plug-in e criar os tipos de postagem personalizados necessários com base nas configurações especificadas pelo usuário.
Este arquivo de classe de tipos de postagem foi carregado no gancho
init
.Achei que tudo o que eu precisava fazer era atualizar as configurações do plug-in e liberar as regras de reescrita. Como a classe de tipos de postagem já foi carregada com base nas configurações do plug-in. Mas com as páginas de administração, elas são carregadas APÓS o
init
gancho.Os tipos de postagem nunca foram realmente registrados, porque as configurações ainda não foram definidas. A classe de registro de tipos de postagem acabou sendo encerrada prematuramente, sem nenhum tipo de postagem registrado.
A solução foi:
(Anteriormente ... faltava o passo 2 - Como mencionado acima ...)
A partir de agora, os tipos de postagem serão carregados no
init
gancho e já terão configurações especificadas, permitindo que os tipos de postagem sejam criados e emparelhados com as regras de reescrita apropriadas.Por qualquer motivo, tive que adicionar uma chamada JavaScript para redirecionar para a página atual, depois de executar as três etapas acima.
Também precisei adicionar uma chamada
flush_rewrite_rules();
na página de configurações de administração do plug-in.Portanto, para garantir que tudo esteja liberado ...
Etapa 1) Navegue até a página de configurações de administração do plug-in. - descarga inicial.
Etapa 2) Atualize as configurações do plugin. - Segunda descarga.
Etapa 3) A página é redirecionada para a página de configurações do plug-in. Causando a ... Terceira e última descarga (igual à descarga inicial - realizada automaticamente quando a página de configurações do plug-in é visitada)
Não estou dizendo que essa é uma solução prática, mas funcionou para mim. Problema muito estranho e provavelmente tem a ver com minha infraestrutura de codificação.
fonte
@ tazo-todua isso funcionou para mim também ao usar multisite.
fonte
MINHA solução encontrada foi:
fonte
Eu estava tendo exatamente o mesmo problema. No meu plugin, tenho tipos de postagem criados dinamicamente. Portanto, eles não podem ser registrados via
register_post_type()
método estático duranteactivation_hook
e, portanto, ainda não estão ativos quandoflush_rewrite_rules()
executados durante esse gancho (que normalmente é a maneira recomendada de liberar regras de reescrita).A solução mais limpa que eu pude encontrar no final foi liberar as regras de reescrita após o registro dos tipos de postagem, mas é claro apenas se essa liberação fosse realmente necessária (porque a operação é lenta). No meu caso, na verdade, tenho vários tipos de postagem personalizados que herdam de uma única classe base e, portanto, era desejável implementar o código que executa a liberação lá.
Se a lavagem é necessária, pode ser decidido observando a saída de
get_option( 'rewrite_rules' )
:Desvantagens:
register_post_type()
.Vantagens:
Só use isso se você não pode registrar o seu tipo de cargo em uma função estática que podem chamar durante tanto
init
eaactivation_hook
!A dependência de como as regras de reescrita geradas durante a
register_post_type()
aparência pode ser atenuada, substituindo o testeif(strpos($key, $args['rewrite']['slug'] ) === 0)
por algo mais elaborado, ou seja, uma expressão regular.fonte