The question:
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?
The Solutions:
Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.
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