web-dev-qa-db-fra.com

Les pages de blog non existantes ne sont pas redirigées vers 404

J'ai une page appelée Blog. Dans le Settings -> Reading, j'ai défini mon Blog page comme Posts page. Dans le menu, lorsque je clique sur le lien Blog, les messages sont chargés correctement et la pagination fonctionne, jusqu'à présent, tout va bien. Toutes les informations proviennent du modèle home.php.

J'utilise mon propre code de pagination qui génère les pages en regardant les paramètres max_num_pages and paged. En bref, il génère un nombre correct de pages avec les liens corrects.

Cependant, lorsque je teste une page de blog inexistante. Par exemple, il y a 5 pages et je tape blog/page/6, il n'est pas redirigé vers 404, mais il semble revenir à la déclaration else de la if(have_posts()) principale.

J'ai testé les pages paginées de catégories qui utilisent le même code de pagination, elles fonctionnent correctement: les pages de catégorie non existantes de type category/<category_name>/page/2 sont redirigées vers le modèle 404.

Je ne vois pas en quoi les pages paginées du blog principal qui n'existent pas ne soient pas redirigées vers 404.

J'apprécierais énormément tous les conseils et l'aide.

Merci beaucoup, Dasha

2
dashaluna

Il s’agit du comportement par défaut de Wordpress pour la pagination lors de l’utilisation d’une requête personnalisée (où vous introduisez vous-même la valeur paginée) ou dans le fichier index.php, car elle ne réalise pas qu’il n’ya pas de contenu à afficher sur la XXXème page tant qu’elle n’a chargé le modèle, puis essaie d’exécuter le WP_Query.

Vous pouvez essayer d'ajouter une logique qui détermine si $ paged est défini et qu'aucun résultat n'est trouvé, puis lancez le 404, qui ressemblerait à ceci:

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

C’est ce que j’utilise habituellement sur functions.php dans chaque site wordpress (je sais, je devrais le coder comme un plugin ...)

/**
 * @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
Daniele Raimondi

J'ai eu quelque chose de similaire récemment sur les pages et les messages dans une installation multisite. Malheureusement, je n’ai pas compris pourquoi WordPress n’appelait parfois pas le modèle 404, mais j’ai créé une solution de contournement:

Dans le functions.php, j'ai créé une petite fonction d'assistance:

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

Et en plus du single.php et du page.php je l'ai appelé comme suit:

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

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

Donc… cela résoudra le problème, mais je ne sais toujours pas pourquoi cela se produit.

2
fuxia