Então, depois de confirmar que eu poderia obter o esperado comportamento de página hierárquica com uma instalação completamente limpa e apenas uma declaração CPT, eu sabia que a falha estava em algum lugar dentro do meu próprio plugin que eu usei para lidar com a criação de CPT metaboxes, taxonomias, etc). O problema era que, apesar de todos os conselhos para verificar se havia problemas de reescrita ou consulta, eu não conseguia ver nada obviamente errado. Eu verifiquei cada filtro e gancho, visualizando a consulta em cada ponto e vendo nada que causaria o 404.
Então eu fiquei com a tarefa de desabilitar / habilitar manualmente cada uma das 9 classes grandes, e então, encontrar pelo menos 2 delas causando o 404, passando por cada função uma a uma e desabilitando / habilitando-as, e em seguida, traçando linha por linha dentro dessas funções - uma força bruta tenta ver exatamente o que estava causando o erro 404, mesmo que eu não soubesse o porquê.
Foi quando descobri que há uma consequência em usar $query->get_queried_object()
. Parece que usar essa função de wrapper realmente modifica $ query em si, que eu pensei que estava retornando inalterada no final da minha função. Foram envolvidos três filtros em duas classes que modificaram a consulta: parse_query
, posts_orderby
, posts_join
- e todas as funções de retorno de chamada estavam chamando $query->get_queried_object()
no $query
arg passado para executar alguns testes condicionais e às vezes modifique a consulta vars (como para casos especiais de ordenação). Estranhamente, essas funções realmente funcionaram bem no que foram projetadas para fazer, apesar do meu uso da função. Eu nunca notei nada de errado com a consulta $ retornada antes!
De alguma forma, depois de mais de um ano de desenvolvimento e uso em dezenas de sites de produção ao vivo, eu nunca havia experimentado nenhum efeito adverso desse erro. Somente quando me aventurei em CPTs hierárquicos, essa pequena diferença de repente quebrou as coisas. Isso é parte do que me jogou tão duro com isso - o melhor que eu poderia dizer, meus filtros de consulta eram confiáveis!
Confesso que ainda não sei exatamente por que chamar essa função quebra apenas um pequeno aspecto das páginas-filhas do CPT - e, no entanto, nunca manifestou nenhum outro problema! Mas ficou claro que usá-lo dentro de um callback de filtro atrapalhava o $query
retornado de alguma forma. Ao remover essa chamada, meus erros 404 desapareceram.
Obrigado por todas as dicas - gostaria de poder dividir a recompensa, à medida que eu obtinha informações de cada resposta, mesmo que a solução final fosse um pouco não relacionada. Esta tem sido uma lição educativa para não confiar cegamente em seu código, mesmo que ele esteja trabalhando para você de forma confiável por um longo tempo, ou não esteja produzindo nenhum erro óbvio.
Às vezes, como o gráfico do kaiser incorpora, você só precisa começar a jogar os interruptores até que as luzes voltem. No meu caso, eu tive que levar a mesma estratégia de solução de problemas até as linhas individuais em uma função antes que eu pudesse ver o problema.