Wordpress Avançado

Custom post type dando 404: flush_rewrite_rules na ativação do plugin

Registrei o post type imovel, o arquivo de listagem em /imoveis/ abre certinho, e /imoveis/casa-no-centro/ devolve o 404 do tema. Não é erro no register_post_type: as regras de reescrita do WordPress ficam gravadas na opção rewrite_rules da tabela wp_options, e ninguém mandou regravar.

A saída de 10 segundos

sudo -u www-data wp rewrite flush
sudo -u www-data wp rewrite list --match=/imoveis/casa-no-centro/

O segundo comando mostra qual regra pegou a URL. Se não voltar nada, o problema é outro: slug do rewrite batendo com uma página existente, ou public em false no register_post_type. Abrir Configurações > Links permanentes e clicar em Salvar dá no mesmo, porque essa tela chama o flush no final. O --hard do WP-CLI só serve pra regravar o .htaccess — em nginx não muda nada.

Resolver de vez no plugin

add_action('init', 'rt_registra_imovel');

register_activation_hook(__FILE__, function () {
    rt_registra_imovel();   // registra ANTES de gerar as regras
    flush_rewrite_rules();
});

register_deactivation_hook(__FILE__, 'flush_rewrite_rules');

A ordem é o pulo do gato. No request da ativação o init já passou, então o post type ainda não existe pro WordPress; chamar o flush sozinho regrava as regras sem as do CPT e o 404 continua. Por isso a função de registro roda na mão, ali dentro, antes do flush.

O que nunca fazer

Não chame flush_rewrite_rules() dentro do init pra garantir. Isso faz um UPDATE na wp_options a cada carregamento de página, do admin e do site, e derruba a performance inteira. Em tema, o gancho equivalente ao de ativação é o after_switch_theme.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

systemd timer no lugar do cron: agendar script com log e sem execução dupla

Um par .service e .timer substitui a linha do crontab com log no journal, execução perdida recuperada no boot e…

13 horas atrás

Descrição em massa no WooCommerce: wp eval-file lendo a lista de SKUs

400 produtos importados do fornecedor com a aba Descrição vazia. Um wp eval-file percorre os SKUs sem texto, grava pelo…

20 horas atrás

Frete grátis no WooCommerce: esconder as outras opções de entrega

Some com PAC e SEDEX da lista quando o frete grátis está disponível, usando woocommerce_package_rates, e limpe o cache de…

1 dia atrás

Erro HTTP no WordPress ao enviar imagem para a biblioteca de mídia

A barra de upload chega no fim e o WordPress devolve só "Erro HTTP". Separe as três causas: Imagick barrado…

2 dias atrás

style amp-custom acima de 75KB: como cortar o CSS inline do AMP

The author stylesheet specified in tag 'style amp-custom' is too long? Meça o bloco com curl e tire da fila…

2 dias atrás

Creation of dynamic property: deprecated no PHP 8.3 com WordPress 6.9

debug.log crescendo em gigabytes com avisos de propriedade dinâmica. Veja como isolar o plugin culpado, corrigir a classe e silenciar…

3 dias atrás