Comment forcer un 404 sur WordPress

36

Je dois forcer un 404 sur certains postes en fonction des conditions. J'ai réussi à le faire (bien que je ne sache pas si je l'ai fait correctement) et je suis en train de charger mon modèle 404.php à charger comme prévu.

Mon code:

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    include( get_query_template( '404' ) );
    exit; # so that the normal page isn't loaded after the 404 page
  }
}

add_action( 'template_redirect', 'rr_404_my_event', 1 );

Code 2 de cette question connexe - même problème :

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    global $wp_query;
    $wp_query->set_404();
  }
}

add_action( 'wp', 'rr_404_my_event' );

Mon problème:

Bien que cela paraisse , je reçois le statut 200 OK si je vérifie l'onglet Réseau. Puisqu'il s'agit d'un statut 200 , je crains que les moteurs de recherche n'indexent également ces pages.

Comportement attendu:

Je souhaite qu'un statut 404 Not Found soit envoyé.

    
posée RRikesh 22.03.2013 - 07:53
la source

5 réponses

42

Vous pouvez essayer la fonction Wordpress status_header() pour ajouter le HTTP/1.1 404 Not Found en-tête;

Votre exemple Code 2 serait donc:

function rr_404_my_event() {
  global $post;
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
    global $wp_query;
    $wp_query->set_404();
    status_header(404);
  }
}
add_action( 'wp', 'rr_404_my_event' );

Cette fonction est par exemple utilisée dans cette partie:

function handle_404() {
    ...cut...
    // Guess it's time to 404.
    $wp_query->set_404();
    status_header( 404 );
    nocache_headers();
    ...cut...
}

de la classe wp dans /wp-includes/class-wp.php .

Essayez donc d'utiliser cet exemple modifié Code 2 en plus de votre code template_include .

    
réponse donnée birgire 24.03.2013 - 19:17
la source
12

Ce code a fonctionné pour moi:

add_action( 'wp', 'force_404' );
function force_404() {
    global $wp_query; //$posts (if required)
    if(is_page()){ // your condition
        status_header( 404 );
        nocache_headers();
        include( get_query_template( '404' ) );
        die();
    }
}
    
réponse donnée golchha21 24.03.2013 - 19:42
la source
2

Je ne recommanderais pas de forcer un 404.

Si les moteurs de recherche vous inquiètent, pourquoi ne pas simplement faire une méta "sans index, sans suivi" sur ces pages et la bloquer avec le fichier robots.txt?

Cela peut constituer un meilleur moyen de bloquer l'affichage du contenu

add_filter( 'template_include', 'nifty_block_content', 99 );

function nifty_block_content( $template ) {
  if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
        $template = locate_template( array( 'nifty-block-content.php' ) );
     }
    return $template;
}

Vous pourriez probablement aussi utiliser cette méthode pour charger 404.php , mais j’estime que l’utilisation d’un modèle de page pourrait être une meilleure option.

source

    
réponse donnée BandonRandon 22.03.2013 - 09:47
la source
1

Ma solution:

add_action( 'wp', 'my_404' );
function my_404() 
{
    if ( is_404() ) 
    {
        header("Status: 404 Not Found");
        $GLOBALS['wp_query']->set_404();
        status_header(404);
        nocache_headers();
        //var_dump(getallheaders()); var_dump(headers_list()); die();
    }
}
    
réponse donnée T.Todua 21.07.2014 - 14:24
la source
0

Les codes d'état sont envoyés dans les en-têtes des requêtes HTTP. Votre fonction actuelle est accrochée à un crochet qui sera appelé trop tard.

Vous devriez essayer d’accrocher votre fonction rr_404_my_event() à l’action send_headers .

Je ne sais pas s'il est même possible à ce moment-là de vérifier l'ID de la publication, mais essayez ceci:

add_action( 'send_headers', 'rr_404_my_event' );
function rr_404_my_event() {
    global $post;
    if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
        include( get_query_template( '404' ) );
        header('HTTP/1.0 404 Not Found');
        exit; 
    }
}
    
réponse donnée Marc Dingena 22.03.2013 - 11:42
la source

Lire d'autres questions sur les étiquettes