function mem_date_processing($start_date, $end_date) { // Initalizing our variables $start_date_iso = $start_date; $end_date_iso = $end_date; $event_date = ''; $event_date_short = ''; $event_date_basic = ''; $event_date_num = ''; $event_date_yr = ''; $start_year = ''; $end_year = ''; $unix_start = ''; $unix_end = ''; $event_is_future = false; $event_is_ongoing = false; $ndash = '<span class="ndash">–</span>'; // Step 1 - test and define start date values // ****************************************** if ($start_date !== "") { if (strlen($start_date) > 5) { // the MONTH is defined if (strlen($start_date) > 7) { // the DAY is defined if (strlen($start_date) > 10) { // the TIME is defined $start_date_iso = substr_replace($start_date, 'T', 10, 1); // replace space with T in iso string // 2013-03-11T06:35 } else { // 10 // the DAY is defined, but no time } // 10 } else { // 7 // the MONTH is defined, but no DAY // fix $start_date_iso - add day. $start_date_iso .= '-01'; } // 7 $unix_start = strtotime($start_date_iso); $start_year = date("Y", $unix_start); $start_month = date_i18n("F", $unix_start); } else { // 5 // only the YEAR is defined $event_date = $start_date; $start_year = $start_date; // NOTE: // $unix_start is not yet defined. // let's create a fake ISO / Unix_Start. $start_date_iso .= '-01-01'; $unix_start = strtotime($start_date_iso); } // 5 $event_date_yr = $start_year; } // Step 2 - test and define END date values // **************************************** if ($end_date !== "") { if (strlen($end_date) > 5) { // the MONTH is defined if (strlen($end_date) > 7) { // the DAY is defined if (strlen($end_date) > 10) { // the TIME is defined $end_date_iso = substr_replace($end_date, 'T', 10, 1); } else { // shorter than 10 digits = // DAY is defined, but no time } // end testing for 10 digits } else { // shorter than 7 digits = // MONTH is defined, but no day // default end day for ISO date stamp $end_date_iso .= '-31'; } // end testing for 7 digits $unix_end = strtotime($end_date_iso); $end_year = date("Y", $unix_end); $end_month = date_i18n("F", $unix_end); } else { // shorter than 5 digits = // only the YEAR is defined $end_year = $end_date; // default end month/day for ISO date stamp $end_date_iso .= '-12-31'; $unix_end = strtotime($end_date_iso); } // end testing for 5 digits if ($end_year != $start_year) { $event_date_yr .= $ndash . $end_year; } } else { // no end date defined at all. $end_date_iso = $start_date_iso; $end_year = $start_year; $unix_end = $unix_start; /* Q: Why do we define those values if no end date exists? A: Because they allow us to sort a series of events by their end date - even if the end date isn't defined (in which case the start date is used). Important: we don't change the $end_date value. The $end_date value can be used to test if the user entered an end date. */ } // 3) process the values // Condition 1: do we have a start date? // ************************************* if ($start_date !== "") { // Condition 2: is the MONTH defined ? // *********************************** if (strlen($start_date) > 5) { // Condition 3: do we have an end date ? // ************************************* if ($end_date !== "") { // YES, we have START and END date. // ******************************** // Condition 4: does start/end occur in the same year? // *************************************************** if ($start_year == $end_year) { // YES, same YEAR // Condition 5: do start/end occur the same month? // *********************************************** if ($start_month == $end_month) { // YES, same MONTH // We could test if start DAY is defined - but since we have start/end date, // and it's the same month, we can assume DAY is defined. // Exception: November - 15th December. // Condition 6: do start/end occur the same day? // ********************************************* $start_day = date("j", $unix_start); // j = 1 to 31 $end_day = date("j", $unix_end); $event_date_short = date_i18n("F Y", $unix_start); if ($start_day == $end_day) { // yes, same day! // 5) the events must have a different time // ***************************************** if (date("j", $unix_start) == 1) { // 1er $event_date = date_i18n(_x('l F jS Y, g:i a', 'First day of month', 'mem'), $unix_start); $event_date_basic = date_i18n(_x('F j', 'First day of month', 'mem'), $unix_start); } else { $event_date = date_i18n(_x('l F jS Y, g:i a', 'Other day of month', 'mem'), $unix_start); $event_date_basic = date_i18n(_x('F j', 'Other day of month', 'mem'), $unix_start); } // add the end time $event_date .= $ndash . date(__('g:i a', 'mem'), $unix_end); // numbers only: 31.12.2014 $event_date_num = date(__('j.n.Y', 'mem'), $unix_start); } else { // two different days, but SAME month. // Example: March 4th-15th 2013 if (date("j", $unix_start) == 1) { // 1er $event_date = date_i18n(_x('F jS', 'First day of same month', 'mem'), $unix_start); // \D\u j\e\\r $event_date_basic = date_i18n(_x('F j', 'First day of month', 'mem'), $unix_start); } else { $event_date = date_i18n(_x('F jS', 'Other day of same month', 'mem'), $unix_start); // Du 3 ... // \D\u j $event_date_basic = date_i18n(_x('F j', 'Other day of same month', 'mem'), $unix_start); } // Add END date $event_date .= date_i18n(__('–jS Y', 'mem'), $unix_end); // au 17 mars 2012 $event_date_basic .= date_i18n(_x('–j', 'mem'), $unix_end); $event_date_num = date(__('j', 'mem'), $unix_start); $event_date_num .= $ndash . date(__('j.n.Y', 'mem'), $unix_end); } // end condition 6 // start day equals end day. } else { // ELSE condition 5 // two different MONTHS, but same year $event_date_short = date_i18n("F", $unix_start); // janvier $event_date_short .= $ndash . date_i18n("F Y", $unix_end); // - mars 2012 // condition 6 // TEST if the start DAY is definded // ************************************************ if (strlen($start_date) > 7) { if (date_i18n("j", $unix_start) == 1) { // 1er $event_date = date_i18n(_x('F jS', 'First day of diff month', 'mem'), $unix_start); } else { // sinon $event_date = date_i18n(_x('F jS', 'Other day of diff month', 'mem'), $unix_start); } // process end date. if (date_i18n("j", $unix_end) == 1) { // 1er $event_date .= date_i18n(_x(' – F jS Y', 'First day of month', 'mem'), $unix_end); } else { // sinon $event_date .= date_i18n(_x(' – F jS Y', 'Other day of month', 'mem'), $unix_end); } // numbers: 18.9-5.10.2014 $event_date_num = date(__('j.n–', 'mem'), $unix_start); $event_date_num .= date(__('j.n.Y', 'mem'), $unix_end); } else { // Start DAY not defined = output only the month. $event_date = $event_date_short; $event_date_num = date(__('n', 'mem'), $unix_start); $event_date_num .= $ndash . date(__('n.Y', 'mem'), $unix_end); // note: some weird cases aren't covered here. } // END condition 6 } // END condition 5 // END month testing } else { // ELSE condition 4 // // START YEAR is different from END YEAR // ************************************* // note: we already KNOW that start month IS defined. $event_date_short = date_i18n("F Y", $unix_start); // janvier 2010 // condition 5-A // is START DAY defined? // ************************************** if (strlen($start_date) > 7) { // START DAY is defined // Example = December 15th 2013 - January 3rd 2014 if (date_i18n("j", $unix_start) == 1) { // 1er $event_date = date_i18n(_x('F jS Y', 'First day of diff year', 'mem'), $unix_start); // $event_date = date_i18n( "\D\u j F Y", $unix_start); // 3 janvier 2010 ... } else { // sinon $event_date = date_i18n(_x('F jS Y', 'Other day of diff year', 'mem'), $unix_start); // $event_date = date_i18n( "\D\u j F Y", $unix_start); // 3 janvier 2010 ... } $event_date_num = date(__('j.n.Y', 'mem'), $unix_start); } else { // START DAY is not defined, only the MONTH. $event_date = $event_date_short; $event_date_num = date(__('n.Y', 'mem'), $unix_start); $event_date_num .= $ndash . date(__('n.Y', 'mem'), $unix_end); } // close condition 5-A // START DAY // condition 5-B // is the END DAY defined? // **************************************** if (strlen($end_date) > 7) { // END DAY is defined // $event_date .= date_i18n( " \a\u j F Y", $unix_end); // 17 mars 2012 if (date_i18n("j", $unix_end) == 1) { // 1er $event_date .= date_i18n(_x(' – F jS Y', 'First day of month', 'mem'), $unix_end); } else { // sinon $event_date .= date_i18n(_x(' – F jS Y', 'Other day of month', 'mem'), $unix_end); } $event_date_num .= $ndash . date(__('j.n.Y', 'mem'), $unix_end); $event_date_short .= ' ' . $ndash . ' ' . date_i18n("F Y", $unix_end); // mars 2012 } else { if (strlen($end_date) > 5) { // only END MONTH is defined $event_date_short .= $ndash . date_i18n("F Y", $unix_end); // mars 2012 $event_date = $event_date_short; $event_date_num .= $ndash . date(__('n.Y', 'mem'), $unix_end); } else { // only END YEAR is defined $event_date_short .= $ndash . date("Y", $unix_end); // mars 2012 $event_date = $event_date_short; $event_date_num .= $ndash . date(__('Y', 'mem'), $unix_end); } } // END condition 5-B // testing the end_date } // END condition 4 // $start_year == $end_year // END year testing } else { // ELSE condition 3 // // END date is not defined. // we have ONLY a START date. // ************************** $event_date_short = date_i18n("F Y", $unix_start); // janvier 2010 // condition 4 // test if START DAY is defined. if (strlen($start_date) > 7) { $event_date_num = date(__('j.n.Y', 'mem'), $unix_start); // condition 5 // test if TIME is defined. if (strlen($start_date) > 11) { if (date("j", $unix_start) == 1) { // 1st day of month ? $event_date = date_i18n(_x('l F jS Y, g:i a', 'First day of month', 'mem'), $unix_start); } else { $event_date = date_i18n(_x('l F jS Y, g:i a', 'Other day of month', 'mem'), $unix_start); } } else { // condition 5 // START TIME is not defined. if (date("j", $unix_start) == 1) { // 1st day of month ? $event_date = date_i18n(_x('l, F jS Y', 'First day of month', 'mem'), $unix_start); } else { $event_date = date_i18n(_x('l, F jS Y', 'Other day of month', 'mem'), $unix_start); } } // END condition 5 : end testing for TIME. } else { // ELSE condition 4 : START DAY is not defined. $event_date = $event_date_short; $event_date_num = date(__('n.Y', 'mem'), $unix_start); } // END condition 4 // end testing for START DAY. } // END condition 3 (end_date testing). } else { // condition 2 // start date > 5 // START YEAR only is defined // // For YEAR ONLY display: // Test if we should show the END year. // ************************************ if ($end_date !== "") { if ($end_year != $start_year) { $event_date .= $ndash . $end_year; } } $event_date_short = $event_date; $event_date_num = $event_date; } // END condition 2 (YEAR only) } // END condition 1. // is this a future event? $mem_today = mem_date_of_today(); if ($mem_today["unix"] <= $unix_start) { $event_is_future = true; } // is this an ongoing event? if ($mem_today["unix"] <= $unix_end) { $event_is_ongoing = true; } // build an ARRAY to return: $event_date_array = array("date" => $event_date, "date-short" => $event_date_short, "date-basic" => $event_date_basic, "date-num" => $event_date_num, "start-iso" => $start_date_iso, "end-iso" => $end_date_iso, "start-unix" => $unix_start, "end-unix" => $unix_end, "date-year" => $event_date_yr, "start-year" => $start_year, "end-year" => $end_year, "is-future" => $event_is_future, "is-ongoing" => $event_is_ongoing); return $event_date_array; }
/** * Front-end display of widget. * * @see WP_Widget::widget() * * @param array $args Widget arguments. * @param array $instance Saved values from database. */ function widget($args, $instance) { // Check if there is a cached output $cache = wp_cache_get('widget_mem_events_list', 'widget'); if (!is_array($cache)) { $cache = array(); } if (!isset($args['widget_id'])) { $args['widget_id'] = $this->id; } if (isset($cache[$args['widget_id']])) { echo $cache[$args['widget_id']]; return; } ob_start(); extract($args); $title = !empty($instance['title']) ? $instance['title'] : __('Recent Posts'); $title = apply_filters('widget_title', $title, $instance, $this->id_base); $number = !empty($instance['number']) ? absint($instance['number']) : 5; if (!$number) { $number = 5; } $age = !empty($instance['age']) ? absint($instance['age']) : 7; if (!$age) { $age = 7; } $show_date = isset($instance['show_date']) ? $instance['show_date'] : false; $show_past_events = isset($instance['show_past_events']) ? $instance['show_past_events'] : false; $post_types = !empty($instance['post_types']) ? $instance['post_types'] : 'post'; $post_types = explode(',', $post_types); $mem_today = mem_date_of_today(); // user defined age limit. default = 7 days. $mem_age = $age * DAY_IN_SECONDS; $mem_age_limit_unix = $mem_today["unix"] - $mem_age; $mem_age_limit_iso = date("Y-m-d", $mem_age_limit_unix); // arbitrary six months limit for filtering out old events. $mem_six_months = 180 * DAY_IN_SECONDS; $mem_180day_unix = $mem_today["unix"] - $mem_six_months; $mem_180day_iso = date("Y-m-d", $mem_180day_unix); $r = new WP_Query(apply_filters('widget_posts_args', array('post_type' => $post_types, 'posts_per_page' => $number, 'meta_key' => '_mem_start_date', 'meta_value' => $mem_180day_iso, 'meta_compare' => '>=', 'orderby' => 'meta_value', 'order' => 'DESC', 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true))); if ($r->have_posts()) { // initialize new array to store events $mem_event_list = array(); ?> <?php while ($r->have_posts()) { $r->the_post(); ?> <?php // add item to array. // we need: // 1. start date in iso-format // 2. date for display (date-num) // 3. title // 4. permalink $mem_event_date = mem_date_processing(get_post_meta(get_the_ID(), '_mem_start_date', true), get_post_meta(get_the_ID(), '_mem_end_date', true)); $mem_event_list[] = array("start-unix" => $mem_event_date["start-unix"], "date-num" => $mem_event_date["date-num"], "title" => get_the_title(), "permalink" => get_permalink()); // check for "Repeat" fields, add them to the list as unique events. $date_repeats = get_post_meta(get_the_ID(), '_mem_repeat_date', false); if (!empty($date_repeats)) { foreach ($date_repeats as $date_repeat) { // test if the item is fresh enough if ($date_repeat >= $mem_age_limit_iso) { // format date $mem_repeat_date = mem_date_processing($date_repeat, ''); // add item to array $mem_event_list[] = array("start-unix" => $mem_repeat_date["start-unix"], "date-num" => $mem_repeat_date["date-num"], "title" => get_the_title(), "permalink" => get_permalink()); } } } // end testing for REPEATS } // Filtering the $mem_event_list // 1. filter the dates with $mem_age_limit_unix $mem_event_list = array_filter($mem_event_list, function ($i) use($mem_age_limit_unix) { return $i['start-unix'] >= $mem_age_limit_unix; }); // 2. re-order the dates, based on start-unix usort($mem_event_list, "mem_custom_sort_iso"); // 3. generate the frontend output if (!empty($mem_event_list)) { echo $before_widget; if ($title) { echo $before_title . $title . $after_title; } echo '<ul>'; foreach ($mem_event_list as $key => $item) { ?> <li> <?php if ($show_date == true) { echo '<span class="post-date">'; echo $mem_event_list[$key]["date-num"]; echo ' – </span>'; } ?> <a href="<?php echo $mem_event_list[$key]["permalink"]; ?> "> <?php echo $mem_event_list[$key]["title"]; ?> </h4></a> </li> <?php } echo '</ul>'; echo $after_widget; } // Reset the global $the_post as this query will have stomped on it wp_reset_postdata(); } $cache[$args['widget_id']] = ob_get_flush(); wp_cache_set('widget_mem_events_list', $cache, 'widget'); }