This is something totally new to me, so I did some research. What an exciting question!
I had a look at the how WP saves the date when a post is saved. WP runs post date through wp_checkdate()
, which uses PHP native function checkdate()
. According to the PHP docs checkdate()
considers any year between 1 and 32767 valid, so 1800’s shouldn’t be a problem.
I tested the saving behaviour locally and created a post with a date of 1856-09-03. The date got saved correctly to the database, but it wasn’t showing on the dashboard or the public view of the site.
I then look how (get_)the_date()
works, in case you’re using it in your page templates. It basically turns the post_date into unix timestamp, if I understood correctly, which is limited to 1901-2038 as explaned here, https://stackoverflow.com/questions/3985764/display-past-dates-before-the-year-1800. Luckily that very same Q&A also has the solution to the date problem – DateTime
.
Here’s how to replace default date formatting with DateTime
in (get_)the_date()
.
add_filter( 'get_the_date', function($the_date, $d, $post){
$date = new DateTime( $post->post_date );
return $date->format('Y-m-d H:i:s'); // change formatting as needed
}, 10, 3 );
With that filter I got 1856-09-03 showing inside the post loop when using the_date()
.
To get the old dates showing on the posts list, you can do this,
add_filter( 'manage_posts_columns', function($columns){
unset($columns['date']); // remove default date column
$columns['real_date'] = __('Date'); // replace with custom column
return $columns;
});
add_action( 'manage_posts_custom_column' , function( $column, $post_id ){
if ( 'real_date' === $column ) {
global $post;
$date = new DateTime( $post->post_date );
echo $date->format('Y-m-d H:i:s');
}
}, 10, 2 );
add_filter( 'manage_edit-post_sortable_columns', function($columns){
unset($columns['date']);
$columns['real_date'] = __('Date'); // make custom date column sortable
return $columns;
});
To change the post date shown on the post edit screen’s Publish metabox, I think the only option is to use js/jquery as I didn’t notice any filters related to it.
EDIT
And if you want to use the default date formatting you’ve set in the General Settings, you can get it with get_option( 'date_format' );
. This way you don’t need to hardcode the date formats to the filters above, e.g. 'Y-m-d H:i:s'
.