web-dev-qa-db-fra.com

Comment forcer un 404 sur WordPress

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 bien bien, 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 ne puissent également indexer ces pages.

Comportement attendu:

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

37
RRikesh

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

Donc, votre Code 2 exemple serait:

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 ce code modifié Code 2 en plus de votre code template_include.

47
birgire

Ce code a fonctionné pour moi:

 add_action ('wp', 'force_404'); 
 fonction force_404 () {
 global $ wp_query; // $ posts (si nécessaire) 
 if (is_page ()) {// votre condition 
 status_header (404); 
 nocache_headers (); 
 include ( get_query_template ('404')); 
 die (); 
} 
} 
14
golchha21

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 être un meilleur moyen d'empêcher 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.

la source

2
Brooke.

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();
    }
}
1
T.Todua

Les codes de statut 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 de connecter votre fonction rr_404_my_event() à l'action send_headers.

Je ne sais pas si à ce moment-là, il est même possible 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; 
    }
}
0
Marc Dingena