コード例 #1
0
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;
}
コード例 #2
0
    /**
     * 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 ' &ndash; </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');
    }