I am trying to enable 304 If Modified Since HTTP header in my WordPress site. After doing lot of Googling I find out a site where the author said to put the following line at the very end of wordpress wp-config.php file. Here is the line of code:
header("Last-Modified: " . the_modified_date());
Now the author said that this was it. I dont have to do anything else to achieve 304 If Modified Since HTTP header. But after doing this I tested by HTTP header using the site
and here is the screenshot of my header:

Check the red marked section. The last modified header value is BLANK.
After that I thought this might be some issue with the_modified_date() function so I’ve also tried get_the_modified_date() function. But still no result.
At the very end, I’ve created a small shortcode function to test if these functions are working or not and echoed it inside the short code. When I used the shortcode I can clearly see that the functions are working fine but for some reason sending blank to the 304 If Modified Since HTTP header.
My site is here
Any suggestions on how to solve this?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
the_modified_date() is a template tag that must used inside the loop, that is why it is not wokring for you.
WordPress provide a action and filter hook to include or modify HTTP headers:
But it doesn’t work for this purpose. For example, the next code is not working:
add_action( 'send_headers', 'cyb_add_last_modified_header' );
function cyb_add_last_modified_header() {
//Check if we are in a single post of any type (archive pages has not modified date)
if( is_singular() ) {
$post_id = get_queried_object_id();
if( $post_id ) {
header("Last-Modified: " . get_the_modified_time("D, d M Y H:i:s", $post_id) );
}
}
}
Why?
The main wp query is not build at this moment, neither in wp_headers filter. So, is_singular() returns false, get_queried_object_id() returns NULL and there is no way to get the modified time of the current post.
A posible solution is to use template_redirect action hook, as suggested by Otto in this question (tested and working):
add_action('template_redirect', 'cyb_add_last_modified_header');
function cyb_add_last_modified_header($headers) {
//Check if we are in a single post of any type (archive pages has not modified date)
if( is_singular() ) {
$post_id = get_queried_object_id();
if( $post_id ) {
header("Last-Modified: " . get_the_modified_time("D, d M Y H:i:s", $post_id) );
}
}
}
Method 2
I tried the code from cybmeta but the date wasn’t being set correctly. I am not entirely sure the reason, but after investigating I found the Add Headers plugin which is now deprecated but was a good source of useful code. In that plugin the author sets the Last-Modified header date in a different way and using that to modify the code worked for me. Here is what I ended up with:
add_action('template_redirect', 'cyb_add_last_modified_header');
function cyb_add_last_modified_header($headers) {
//Check if we are in a single post of any type (archive pages has not modified date)
if( is_singular() ) {
$post_id = get_queried_object_id();
if( $post_id ) {
$post_mtime = get_the_modified_time("D, d M Y H:i:s", $post_id);
$post_mtime_unix = strtotime( $post_mtime );
$header_last_modified_value = str_replace( '+0000', 'GMT', gmdate('r', $post_mtime_unix) );
header("Last-Modified: " . $header_last_modified_value );
}
}
}
Method 3
My solution for Last-Modified and correct 304 Not Modified
Inside functions.php
add_action('template_redirect', 'last_mod_header');
function last_mod_header($headers) {
if( is_singular() ) {
$post_id = get_queried_object_id();
$LastModified = gmdate("D, d M Y H:i:s GMT", $post_id);
$LastModified_unix = gmdate("D, d M Y H:i:s GMT", $post_id);
$IfModifiedSince = false;
if( $post_id ) {
if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
$IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
$IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
exit;
}
header("Last-Modified: " . get_the_modified_time("D, d M Y H:i:s", $post_id) );
}
}
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0