web-dev-qa-db-fra.com

Définition du dernier en-tête HTTP sur la page d'accueil statique

En réponse à la question posée ici je me trouve, ainsi que l'autre utilisateur, à la recherche d'une solution permettant de définir un dernier en-tête modifié contenant la date et l'heure de la publication la plus importante. Comme nous avons tous les deux dans de nombreux thèmes, la page d'accueil est définie sur une page statique, puis codée dans les fichiers statiques de notre contenu dynamique, il nous manque cet en-tête important pour nous assurer que les pages d'accueil mises en cache sont mises à jour en cas de nouvelles publications.

Alors, comment pouvons-nous définir un dernier en-tête HTTP modifié sur une page contenant la publication la plus récente?

3
JpaytonWPD

En-tête Last-Modified pour les visiteurs en première page

Il est utile de voir comment l'en-tête Last-Modified est ajouté aux flux, dans la méthode wp::send_header() .

Si nous voulons pouvoir utiliser is_front_page(), alors les filtres wp_headers ou send_header sont probablement appliqués tôt.

Nous pourrions utiliser le crochet template_redirect pour cibler la page de garde, avant que les en-têtes ne soient envoyés et après que is_front_page() soit prêt.

Voici un exemple:

/**
 * Set the Last-Modified header for visitors on the front-page 
 * based on when a post was last modified.
 */

add_action( 'template_redirect', function() use ( &$wp )
{
    // Only visitors (not logged in)
    if( is_user_logged_in() )
        return;

    // Target front-page
    if( ! is_front_page() )
        return;

    // Don't add it if there's e.g. 404 error (similar as the error check for feeds)
    if( ! empty( $wp->query_vars['error'] ) )
        return;

    // Don't override the last-modified header if it's already set
    $headers = headers_list();
    if( ! empty( $headers['last-modified'] ) )  
        return;

    // Get last modified post
    $last_modified = mysql2date( 'D, d M Y H:i:s', get_lastpostmodified( 'GMT' ), false );

    // Add last modified header
    if( $last_modified && ! headers_sent() )
        header( "Last-Modified: " . $last_modified . ' GMT' );

}, 1 );

Ici, nous avons utilisé le noyau PHP fonctions header() , headers_list() et headers_sent() et la fonction principale de WordPress get_lastpostmodified()

Le Etag en-tête pourrait être ajouté ici aussi comme le md5 de la date de la dernière modification.

Nous pouvons ensuite le tester à partir de la ligne de commande avec, par exemple:

# curl --head https://example.tld

ou utilisez simplement le paramètre abrégé -I pour extraire uniquement les en-têtes HTTP.

2
birgire

Non testé, mais il devrait travail:

$query = "SELECT MAX(post_modified) AS modified FROM {$wpdb->prefix}posts";
$results = $wpdb->get_results($query);

if (isset($results[0]->modified) {
    header("Last-Modified: ".$results[0]->modified);
}
0
PSD to Final