web-dev-qa-db-de.com

Nicht vorhandene Blogseiten werden nicht an 404 weitergeleitet

Ich habe eine Seite namens Blog. Im Settings -> Reading habe ich meinen Blog page als Posts page festgelegt. Wenn ich im Menü auf den Link Blog klicke, werden die Beiträge korrekt geladen und die Paginierung funktioniert, soweit so gut. Alle Informationen stammen aus der Vorlage home.php.

Ich verwende meinen eigenen Paginierungscode, der die Seiten generiert, die max_num_pages and paged-Parameter anzeigen. Kurz gesagt, es werden die richtigen Seiten mit den richtigen Links generiert.

Wenn ich jedoch eine nicht vorhandene Blog-Seite teste. Zum Beispiel gibt es 5 Seiten und ich tippe blog/page/6 es wird nicht zu 404 umgeleitet, stattdessen scheint es auf die else-Anweisung der main if(have_posts()) zurückzugreifen.

Ich habe die kategorie-paginierten Seiten getestet, die denselben Paginierungscode verwenden. Sie funktionieren ordnungsgemäß: Nicht vorhandene Kategorieseiten des Typs category/<category_name>/page/2 werden zur Vorlage 404 umgeleitet.

Ich kann mir nichts vorstellen, warum die nicht existierenden Seiten des Hauptblogs nicht zu 404 weitergeleitet werden.

Ich würde mich über Tipps und Hilfe sehr freuen.

Vielen Dank, Dasha

2
dashaluna

Dies ist das Standardverhalten von Wordpress für die Paginierung bei Verwendung einer benutzerdefinierten Abfrage (bei der Sie den Seitenwert selbst eingeben) oder in der index.php, da nicht erkannt wird, dass auf der XXX-Seite erst dann Inhalt angezeigt werden kann, wenn dies der Fall ist hat die Vorlage geladen und versucht dann, die WP_Query auszuführen.

Sie können versuchen, eine Logik hinzuzufügen, die bestimmt, ob $ paged gesetzt ist und keine Ergebnisse gefunden werden. Dann werfen Sie den 404, der ungefähr so ​​aussieht:

header("HTTP/1.0 404 Not Found");
$wp_query->set_404();
require TEMPLATEPATH.'/404.php';
exit;
1
Dave Hunt

Dies ist, was ich normalerweise auf meiner functions.php in jeder WordPress-Site benutze (ich weiß, ich sollte es als Plugin codieren ...)

/**
 * @author daniele raimondi W3B snc
 * @version 0.4
 * @abstract This workaround fixes a problem with page pagination, where you can request
 * n paginated part of a (non-paginated)page from 2 to 2147483647 (max 32 signed int value)
 * and you will never get a 404 error. WP returns instead the page itself  if it's a not-paginated page, 
 * or the first page if you request n-paginated pages, from n+1 on.
 */

function fix_missing_404_on_paginated_page() {
    global $wp_query,$page,$paged;

    if (!isset($page)) $page = get_query_var('page');
    if (!isset($paged)) $paged = get_query_var('paged');
    if (is_page() || is_single()) {
        $realpagescount = count( explode( '<!--nextpage-->', $wp_query->post->post_content ) );

        if ( (isset($page) && isset($realpagescount) && $page >= $realpagescount) || (is_paged() && isset($paged) && $paged >=0 ) ){
        //wp_redirect( home_url() );
            nocache_headers();
            status_header( '404' );
            $wp_query->is_404=true;
            $wp_query->is_single=false;
            $wp_query->is_singular=false;
            $wp_query->post_count=0;
            $wp_query->page=0;
            $wp_query->query['page']='';
            $wp_query->query['posts']=array();
            $wp_query->query['post']=array();
            $wp_query->posts=array();
            $wp_query->post=array();
            $wp_query->queried_object=array();
            $wp_query->queried_object_id=0;
            locate_template('404.php', true);
            exit;
        }
    }
}
add_action('template_redirect', 'fix_missing_404_on_paginated_page');
3

Ich hatte in letzter Zeit etwas Ähnliches auf Seiten und Posts in einer Multisite-Installation. Leider habe ich nicht herausgefunden warum WordPress hat die 404-Vorlage manchmal nicht aufgerufen, aber ich habe eine Problemumgehung erstellt:

Im functions.php habe ich eine kleine Hilfsfunktion erstellt:

/**
 * Helper for cases where the 404 template is not loaded correctly.
 *
 * @return bool
 */
function t5_force_404()
{
    if ( have_posts() )
    {
        return FALSE;
    }

    header( 'HTTP/1.0 404 Not Found' );
    locate_template( '404.php', TRUE, TRUE );
    $GLOBALS['wp_query']->is_404 = TRUE;
    return TRUE;
}

Und oben auf dem single.php und page.php habe ich es so genannt:

if ( t5_force_404() ) {
    return; // stop any further processing
}

// everything is fine, go on.
get_header();

Also ... das wird das Problem lösen, aber ich weiß immer noch nicht, warum es passiert.

2
fuxia