Wie generiere ich programmgesteuert einen 404?

7

Wie kann ich so etwas zum Laufen bringen?

// in a plugin / theme:
// This imaginary function will make WordPress think that the 
// current request is a 404. 
// Ideally this function could be ran anywhere, but realistically it
// will probably have to be before the template_redirect hook runs.
generate_404_somehow();

// later...
add_action('template_redirect', function() {
    // should be "true"
    var_dump(is_404());
});

Grundsätzlich möchte ich WordPress unter bestimmten Bedingungen anweisen, seine 404-Vorlage (die ich später einbinden kann, wenn ich möchte) anstelle der Vorlage anzuzeigen, die gerade geladen wird (z. B. eine Seite oder ein Archiv).

Ich weiß, ich könnte einfach 302zu einer nicht existierenden Seite umleiten, aber das ist sehr chaotisch. Ich könnte einen 404HTTP-Header auch manuell senden , aber dann kann ich die schöne 404-Seite von WP nicht verwenden (ich habe bereits Dinge, die sich in is_404()diese Notwendigkeit einfügen, um zum richtigen Zeitpunkt ausgelöst zu werden).

dave1010
quelle
Vielleicht könnte ich die Abfrage ändern, um nach einer nicht existierenden Seite zu suchen.
Dave1010
Können Sie die Frage hier klären? Versuchen Sie, Code auf der 404-Seite Ihres Themas auszuführen, oder möchten Sie absichtlich einen 404-Fehler erstellen?
Steve
Ich möchte eine 404 erstellen. Ich werde die Frage ein wenig bearbeiten ...
dave1010
In welchem ​​Fall / wann und warum möchten Sie eine 404-Seite erstellen?
Fischi
Ich musste dies bei mindestens zwei verschiedenen Gelegenheiten tun. Zuletzt wurde dafür gesorgt, dass ältere Autorenseiten eine geben 404. Ich bin mir auch sicher, dass ich es in Zukunft wieder brauchen werde.
Dave1010

Antworten:

6
function generate_404_somehow() {
   global $wp_query;
   $wp_query->is_404 = true;
}
add_action('wp','generate_404_somehow');

Dadurch wird natürlich Ihre gesamte Seite an die 404-Vorlage gesendet. Ich weiß nicht, unter welchen Bedingungen dies feuern soll oder nicht.

Oder um vorsichtiger zu sein (siehe Kommentare) ...

function generate_404_somehow() {
   global $wp_query;
   $wp_query->set_404();
}
add_action('wp','generate_404_somehow');
s_ha_dum
quelle
Dies funktioniert, wird aber $wp_query->set_404()auch ausgeführt $wp_query->init_query_flags(), wodurch alle anderen is_*Flags auf false gesetzt werden.
Dave1010
Stimmt, aber ich sehe keine Notwendigkeit für den (sehr geringen) Overhead. Es würde mich interessieren, ob es einen Fall gibt, in dem dies nicht funktioniert. Ich kann keinen finden.
s_ha_dum
Ich muss sicherstellen , dass Dinge wie is_single()und is_archive()return false, so dass jeder Haken , die sie korrekt sind zu überprüfen und fügen Sie keine Extramaterial auf der 404 - Seite (wie die „Weiter“ und „Zurück“ Links). Dies hängt jedoch von Plugins und Themes ab.
Dave1010
1
Ich verstehe die Vorsicht. Die Verwendung $wp_query->set_404()in meiner Funktion sollte dies abdecken. Ich gehe davon aus, dass Sie sich dazu entschlossen haben.
s_ha_dum
1

Die andere Antwort von s_ha_dum setzt den HTTP-Header-Status nicht auf 404 Not Found . Dies fügt status_header( 404 )der Funktion hinzu.

function generate_404_somehow() {
    global $wp_query;
    $wp_query->set_404();
    status_header( 404 );
}
add_action('wp','generate_404_somehow');
Erik J.
quelle
Sie können zusätzlich hinzufügen, nocache_headers()wie in gesehen WP::handle_404().
Nicolai
0

Was scheint zu funktionieren:

global $wp_query;
$wp_query->set_404();
$wp_query->max_num_pages = 0; // stop theme from showing Next/Prev links

Dies scheint die HTTP-Header zu setzen und die richtige Vorlage zu laden (mit is_404()true).

dave1010
quelle