Existem ganchos que alteram a lógica 404?

27

Desde que você tenha uma página 404 definida em seu tema, o Wordpress exibirá uma página 404 se "tag" for definida em $ wp_query-> query_vars, e não houver postagens correspondentes a essa tag.

Estou escrevendo um plugin que exibe algumas informações em cada página, além de postagens. Gostaria de alterar a lógica 404, para que a página 404 seja exibida se não houver postagens correspondentes a uma tag e o plug-in não puder acessar nenhum dado correspondente a essa tag. Se o plug-in puder encontrar dados, eu gostaria de mostrar uma página normal, independentemente de haver postagens ou não nessa página ...

Venho pesquisando no Google, lendo código, lendo o códice e bisbilhotando por aqui, e não consegui descobrir onde o Wordpress aciona esse 404 e como posso substituí-lo. (Eu tenho a sensação de que isso pode ter algo a ver com status_header () no functions.php, mas não está claro como e quando eu preciso me conectar a ele).

Qualquer ajuda / idéias / iluminação apreciada.

Obrigado,

~ Patch

Patch
fonte

Respostas:

29

Depois de um pouco mais de trabalho árduo no código e no Google, encontrei a resposta. Ele está contido neste tópico (consulte a publicação de Otto42), mas, para o registro, adicionar o seguinte ao seu plugin substituirá o tratamento 404 pelas condições que você especificar:

add_filter('template_redirect', 'my_404_override' );
function my_404_override() {
    global $wp_query;

    if (<some condition is met>) {
        status_header( 200 );
        $wp_query->is_404=false;
    }
}

Observe que você precisa definir "is_404" como false antes que o PHP produza cabeçalhos, e é por isso que encaixá-lo na lógica template_redirect é uma boa idéia.

~ Patch

Patch
fonte
5

Eu precisava fazer o mesmo para um projeto personalizado, onde sempre havia uma página 200, e descobri que você também pode simplesmente adicioná-lo ao topo do seu arquivo de modelo (acima de get_header ();)

global $wp_query;
status_header( 200 );
$wp_query->is_404=false;
sem entrada
fonte
11
Great! This worked for me. I was making my script and it generated 404. I tried runnig scripts from wp->main but that was not a ver clean solution. This worked for me: // configuration require('./wp-load.php'); // init WP (inits objects, language and stuff). wp(); // fix title (this is not 404) $wp_query->is_404 = false; // doesn't fix the actual 404 status status_header( 200 ); // but this does :-)
Nux
1

Crie um 404.phparquivo de modelo no seu tema e personalize conforme necessário (adicionando a saída do plug-in ou o que for). Você mencionou definido em seu tema , o que exatamente está errado com essa abordagem para você?

Codex Criando uma Página de Erro 404

Rarst
fonte
O que estou procurando é uma maneira de alterar as circunstâncias nas quais a página 404 é acionada. No momento, se o Wordpress não encontrar nenhuma postagem que corresponda a uma tag nos vars de consulta, a página 404 será exibida. Gostaria de inserir um código adicional que garanta que a página 404 apareça apenas se o Wordpress não encontrar nenhuma postagem e meu plug-in não encontrar nenhuma informação suplementar a ser exibida.
Patch
O objetivo do 404 é que o visitante saiba que o link está errado e que você o registre e corrija (se necessário). Você não quer dizer ao visitante que ele está usando um link quebrado ou esteja ciente disso. A exibição de informações no 404 funciona bem, o seqüestro não é um requisito, então por que se preocupar? Apenas tentando entender sua lógica e / ou detalhes técnicos.
Rarst 16/09
11
O que eu procurava era uma maneira de alterar a definição de quais páginas estão "erradas". O site que estou construindo tem um componente de blog, mas isso não é tudo. Estou usando tags do Wordpress para exibir postagens do Wordpress e obter conteúdo adicional por meio do plug-in. Desejo retornar um código de status 200 se a) houver postagens ou b) meu plug-in puder encontrar coisas para exibir que correspondam à tag. Daí a necessidade de religar a lógica. Independentemente disso, obrigado por dedicar um tempo para escrever uma resposta - desculpe-me por meu problema ser estranho o suficiente para precisar de uma resposta mais envolvida :-)
Patch