Y a-t-il des crochets qui modifient la logique 404?

27

À condition que vous ayez une page 404 définie dans votre thème, Wordpress affichera une page 404 si "tag" est défini dans $ wp_query-> query_vars, et il n'y a pas de messages correspondant à cette balise.

J'écris un plugin qui affiche des informations sur chaque page, en plus des articles. Je voudrais modifier la logique 404 afin que la page 404 s'affiche s'il n'y a pas de messages correspondant à une balise et que le plugin ne puisse pas extraire de données correspondant à cette balise. Si le plugin peut trouver des données, je voudrais afficher une page normale, qu'il y ait ou non des publications sur cette page ...

J'ai fait des recherches sur Google, lu du code, lu le codex et fouillé ici, et je n'ai pas été en mesure de déterminer où Wordpress déclenche ce 404 et comment je peux le remplacer. (J'ai le sentiment que cela pourrait avoir quelque chose à voir avec status_header () dans functions.php, mais ce n'est pas clair comment et quand je dois m'y connecter).

Toute aide / idée / illumination appréciée.

Je vous remercie,

~ Patch

Pièce
la source

Réponses:

29

Après avoir fouillé un peu plus dans le code et sur Google, j'ai trouvé la réponse. Il est contenu dans ce fil (voir le post d'Otto42), mais pour mémoire, l'ajout de ce qui suit à votre plugin remplacera la gestion 404 pour les conditions que vous spécifiez:

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;
    }
}

Notez que vous devez définir "is_404" sur false avant que PHP n'envoie les en-têtes, c'est pourquoi le connecter dans la logique template_redirect est une bonne idée.

~ Patch

Pièce
la source
5

J'avais besoin de faire de même pour un projet personnalisé où il y avait toujours 200 pages, et j'ai trouvé que vous pouvez également simplement l'ajouter en haut de votre fichier de modèle (au-dessus de get_header ();)

global $wp_query;
status_header( 200 );
$wp_query->is_404=false;
pas d'entrée
la source
1
Génial! Cela a fonctionné pour moi. Je faisais mon script et il en a généré 404. J'ai essayé d'exécuter des scripts à partir de wp-> main mais ce n'était pas une solution très propre. Cela a fonctionné pour moi:// 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

Créez un 404.phpfichier de modèle dans votre thème et personnalisez-le au besoin (en ajoutant la sortie de votre plugin ou autre). Vous mentionnez défini dans votre thème , qu'est-ce qui ne va pas exactement avec cette approche pour vous?

Page Codex créant une erreur 404

Rarst
la source
Ce que je recherche, c'est un moyen de modifier les circonstances dans lesquelles cette page 404 est déclenchée. À l'heure actuelle, si Wordpress ne trouve aucun article correspondant à une balise dans les variables de requête, la page 404 s'affiche. Je voudrais ajouter du code supplémentaire qui garantit que la page 404 n'apparaît que si Wordpress ne trouve aucun article et que mon plugin ne trouve aucune information supplémentaire à afficher.
Patch du
Le but de 404 est que le visiteur sache que le lien est incorrect et que vous le connectiez et répariez (si nécessaire). Vous ne voulez ni dire au visiteur qu'il utilise un lien brisé ni en être conscient vous-même. L'affichage d'informations sur 404 fonctionne très bien, le détournement n'est pas une exigence, alors pourquoi s'embêter? J'essaie juste de saisir votre logique et / ou vos détails techniques.
Rarst
1
Ce que je cherchais, c'était un moyen de changer la définition de quelles pages étaient "incorrectes". Le site que je crée a un composant de blog, mais ce n'est pas tout. J'utilise des balises Wordpress à la fois pour afficher les publications Wordpress et extraire du contenu supplémentaire via le plugin. Je veux retourner un code d'état 200 si a) il y a des messages ou b) mon plugin peut trouver des éléments à afficher qui correspondent à la balise. D'où la nécessité de recâbler la logique. Quoi qu'il en soit, merci d'avoir pris le temps d'écrire une réponse - désolé que mon problème était assez bizarre pour avoir besoin d'une réponse plus impliquée :-)
Patch