it-swarm.com.de

Wie man ein 404 auf WordPress erzwingt

Ich muss auf einigen Posts eine 404 erzwingen, basierend auf den Bedingungen. Ich habe es geschafft (obwohl ich nicht weiß, ob ich es richtig gemacht habe) und ich bekomme eine 404.php-Vorlage, die wie erwartet geladen wird.

Mein 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 von dieser verwandten Frage - dem gleichen Problem:

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' );

Mein Problem:

Obwohl es sieht gut aus, erhalte ich einen Status 200 OK, wenn ich die Netzwerkregisterkarte überprüfe. Da es sich um einen Status 200 handelt, befürchte ich, dass Suchmaschinen diese Seiten auch indizieren könnten.

Erwartetes Verhalten:

Ich möchte, dass ein Status 404 Not Found gesendet wird.

37
RRikesh

Sie können die Wordpress-Funktion status_header() verwenden, um den Header HTTP/1.1 404 Not Found hinzuzufügen.

Ihr Code 2 Beispiel wäre also:

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' );

Diese Funktion wird zum Beispiel in diesem Teil verwendet:

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

aus der Klasse wp in /wp-includes/class-wp.php.

Versuchen Sie also, dieses geänderte Code 2 - Beispiel zusätzlich zu Ihrem template_include-Code zu verwenden.

47
birgire

Dieser Code hat bei mir funktioniert:

 add_action ('wp', 'force_404'); 
 function force_404 () {
 global $ wp_query; // $ posts (falls erforderlich) 
 if (is_page ()) {// your condition 
 status_header (404); 
 nocache_headers (); 
 include ( get_query_template ('404'); 
 die (); 
} 
} 
14
golchha21

Ich würde nicht empfehlen, einen 404 zu erzwingen.

Wenn Sie sich Sorgen um Suchmaschinen machen, warum nicht einfach ein "no-index, no-follow" -Meta auf diesen Seiten erstellen und es mit robots.txt blockieren?

Dies ist möglicherweise eine bessere Möglichkeit, die Anzeige von Inhalten zu blockieren

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

Sie könnten diese Methode wahrscheinlich auch zum Laden von 404.php verwenden, aber ich bin der Meinung, dass die Verwendung einer Seitenvorlage eine bessere Option ist.

Quelle

2
Brooke.

Meine Lösung:

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

Statuscodes werden in den Headern von HTTP-Anforderungen gesendet. Ihre aktuelle Funktion ist in einen Hook eingebunden, der zu spät aufgerufen wird.

Sie sollten versuchen, Ihre Funktion rr_404_my_event() in action send_headers einzuhängen.

Ich bin mir nicht sicher, ob es zu diesem Zeitpunkt überhaupt möglich ist, die Post-ID zu überprüfen, aber probieren Sie es aus:

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