Skip to content

Instantly share code, notes, and snippets.

@brianjhanson
Last active November 18, 2023 05:07
Show Gist options
  • Star 18 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save brianjhanson/17e33b1d008fd69e3ea5 to your computer and use it in GitHub Desktop.
Save brianjhanson/17e33b1d008fd69e3ea5 to your computer and use it in GitHub Desktop.
<?php
function the_date_range($args) {
global $post;
$default = array(
'start_field' => 'start_date',
'end_field' => null,
'base_format' => 'Ymd',
'post_id' => $post->ID,
'separator' => '<span class="date-separator">&ndash;</span>',
'month_format' => 'F',
'day_format' => 'j',
'year_format' => 'Y'
);
$s = array_intersect_key($args + $default, $default);
$start = get_field($s['start_field'], $s['post_id']);
$end = get_field($s['end_field'], $s['post_id']);
// Checks to make sure the start is a valid field
if($start) {
$raw_dates['start'] = DateTime::createFromFormat( $s['base_format'], $start );
} else {
return;
}
// Adds end field if there is one
if( $end ) {
$raw_dates['end'] = DateTime::createFromFormat( $s['base_format'], $end );
}
// Sets up the $dates array
foreach($raw_dates as $key => $value) {
$dates[$key] = array(
'month' =>$value->format($s['month_format']),
'day' => $value->format($s['day_format']),
'year' => $value->format($s['year_format'])
);
}
// if the years aren't the same the whole output has to change so we check that
// at the beginning
if($dates['start']['year'] == $dates['end']['year']) {
// if years are the same and months are the same
if($dates['start']['month'] == $dates['end']['month']) {
// if years, months and days are the same (same date in both fields)
if($dates['start']['day'] == $dates['end']['day']) {
$range = $dates['start']['month']." ".$dates['start']['day'].", ".$dates['start']['year'];
// if years and months are the same but not days
} else {
$range = $dates['start']['month']." ".$dates['start']['day'].$s['separator'].$dates['end']['day'].", ".$dates['start']['year'];
}
// if years are the same but months are not the same
} else {
$range = $dates['start']['month']." ".$dates['start']['day'].$s['separator'].$dates['end']['month']." ".$dates['end']['day'].", ".$dates['start']['year'];
}
} else {
$range = $dates['start']['month']." ".$dates['start']['day'].", ".$dates['start']['year'].$s['separator'].$dates['end']['month']." ".$dates['end']['day'].", ".$dates['end']['year'];
}
echo $range;
}
@keishabien
Copy link

Thanks for the quick reply Brian! I will test out what you mentioned and see if I can get that to work. It's interesting that ACF still doesn't seem to have this feature natively. Cheers!

@keishabien
Copy link

@brianjhanson hi again! I correctly called the function and was able to get it to display my date range. Thanks again for replying!

@atazminhlk 's answer was also key to my solution - setting the field names and base format correctly. The ACF field return format should match the base_format in the $args array.

@brianjhanson
Copy link
Author

@keishabien 🎉 glad you got it working!

@LukeF12
Copy link

LukeF12 commented Nov 18, 2023

Great work, thanks so much for doing this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment