web-dev-qa-db-fra.com

Prévention de l'erreur 404 sur les archives de dates vides

Sur une page d’archive de date où il n’ya pas de publication (pour cette date), WordPress affiche la page 404.

Existe-t-il un moyen de faire en sorte que WordPress continue à utiliser l'archive d'origine au lieu de la 404. De cette manière, je peux utiliser la condition if ( have_posts() ) pour générer un message "Aucune publication trouvée".

4
Ben Everard

Vous pouvez déplacer le code de la réponse de l'OP dans un filtre de modèle 404 et forcer le WP à charger le fichier date.php au lieu de 404.php. Il enverra toujours l'en-tête 404, mais affichera la page avec un autre modèle.

function wpd_date_404_template( $template = '' ){
    global $wp_query;
    if( isset($wp_query->query['year'])
        || isset($wp_query->query['monthnum'])
        || isset($wp_query->query['day']) ){
            $template = locate_template( 'date.php', false );
    }
    return $template;
}
add_filter( '404_template', 'wpd_date_404_template' );
4
Milo

D'accord, à la réflexion, je ne suis pas sûr de demander trop à WP. D'un point de vue SEO, je suppose que je veux des pages vides jusqu'à 404, je ne veux certainement pas qu'elles soient indexées.

J'ai décidé d'utiliser le modèle 404 pour générer le message "Aucun message trouvé", mais comme les fonctions is_date(), is_day() (et autres) ne fonctionneront pas sur la page 404, j'ai ajouté ce code pour détecter si le 404 était censé être un archive de date.

Collez ce qui suit dans votre 404.php pour détecter l’URL:

global $wp_query;

$is_date_archive = ( isset($wp_query->query['year']) || isset($wp_query->query['monthnum']) || isset($wp_query->query['day']) );

Je peux ensuite utiliser la variable $is_date_archive pour modifier le modèle 404 en conséquence.

Exemple (404.php)

global $wp_query;

$is_date_archive = ( isset($wp_query->query['year']) || isset($wp_query->query['monthnum']) || isset($wp_query->query['day']) );

if( $is_date_archive ){ echo 'No posts found'; } else { echo 'general 404 page'; }
3
Ben Everard