Las páginas de blog no existentes no se redirigen a 404

2

Tengo una página llamada Blog. En el Settings -> Reading he establecido mi Blog page como Posts page . En el menú, cuando hago clic en el enlace Blog , las publicaciones se cargan correctamente y la paginación funciona, hasta ahora todo bien. Toda la información proviene de la plantilla home.php .

Estoy usando mi propio código de paginación que genera las páginas mirando max_num_pages and paged params. En resumen, genera la cantidad correcta de páginas con los enlaces correctos.

Sin embargo, cuando pruebo una página de blog inexistente. Por ejemplo, existen 5 páginas y escribo blog/page/6 que no se redirige a 404, en cambio, parece recurrir a la declaración else del main if(have_posts()) .

He probado la categoría de páginas paginadas que usan el mismo código de paginación, funcionan correctamente: las páginas de categorías no existentes del tipo category/<category_name>/page/2 se redirigen a la plantilla 404 .

No puedo pensar en nada por lo que las "páginas paginadas" del blog principal que no existen no se redirigen a 404.

Apreciaría enormemente cualquier consejo y ayuda.

Muchas gracias, Dasha

    
pregunta dashaluna 19.03.2012 - 20:39

3 respuestas

1

Este es el comportamiento predeterminado de Wordpress para la paginación cuando se usa una consulta personalizada (donde ingresa usted mismo el valor paginado) o en index.php, ya que no se da cuenta de que no hay contenido para mostrar en la XXX página hasta ya ha cargado la plantilla y luego intenta ejecutar WP_Query.

Puedes intentar agregar una lógica que determine si $ paginado está establecido y no se encuentran resultados, luego lanza el 404, que se vería así:

header("HTTP/1.0 404 Not Found");
$wp_query->set_404();
require TEMPLATEPATH.'/404.php';
exit;
    
respondido por el Dave Hunt 19.03.2012 - 21:22
3

Esto es lo que normalmente uso en mi functions.php en cada sitio de wordpress (lo sé, debería codificarlo como un complemento ...)

/**
 * @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');
    
respondido por el Daniele Raimondi 30.07.2013 - 16:44
2

Recientemente tuve algo similar en páginas y publicaciones en una instalación multisitio. Desafortunadamente, no he descubierto el por qué WordPress no llamó a la plantilla 404 a veces, pero creo una solución alternativa:

En el functions.php he creado una pequeña función de ayuda:

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

Y encima de single.php y page.php lo llamé así:

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

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

Entonces ... esto resolverá el problema, pero aún no sé por qué sucede.

    
respondido por el fuxia 19.03.2012 - 21:05

Lea otras preguntas en las etiquetas