• Resolved megseoh

    (@megseoh)


    I’ve inherited some code that is displaying my organization’s upcoming events in an array of months. The issue is that the months always display as occurring in the current year regardless of when they will be taking place. I think I need to sort the events by year before sorting and displaying them by month. I’m pasting the code below & here is a gist with additional notes I’ve made to help me figure it out what’s going on.

    <?php
    $eventArray = array();
    
    $currentMonth = date('n');
    $currentYear = date('Y');
    
    //Generate our months from the system time.
    for ($i = $currentMonth; $i <= 12; $i++) {
        $monthName = date('F', mktime(0, 0, 0, $i, 10)); // March
        $eventArray[$monthName] = array();
    }
    
    $returnData = '';
    
    //Custom Post-Type Events
    $args = array(
        'posts_per_page' => -1,
        'offset' => 0,
        'category' => '',
        'orderby' => 'post_date',
        'order' => 'ASC',
        'include' => '',
        'exclude' => '',
        'meta_key' => 'FASE_event_date',
        'orderby' => 'meta_value',
        'post_type' => 'events',
        'post_mime_type' => '',
        'post_parent' => '',
        'post_status' => 'publish',
        'suppress_filters' => true
    );
    $allData = get_posts($args);
    
    //Search through all our data and sort into months
    foreach ($allData as $data) {
        $postDate = strtotime(get_post_meta($data->ID, 'FASE_event_date', true));
        //Check if the index exists.  If so, then populate that data.
        if (array_key_exists(date("F", $postDate), $eventArray)) {
            array_push($eventArray[date("F", $postDate)], $data);
        }
    }
    
    foreach ($eventArray as $key => $arrayData) {
        if (count($arrayData) > 0) {
            ?>
            <h2><?php echo $key . ' ' . $currentYear; ?></h2>
            <div class="row">
                <?php
                $reverseArray = array_reverse($arrayData);
    
                foreach ($reverseArray as $data) {
                    if (get_post_meta($data->ID, 'FASE_endDate', true) != "") {
                        $startDay = get_post_meta($data->ID, 'FASE_event_date', true);
                        $endDay = get_post_meta($data->ID, 'FASE_endDate', true);
    
                        $postDate = date("M j, Y", strtotime($startDay)) . " to " . date("M j, Y", strtotime($endDay));
                    } else {
                        $targetTime = get_post_meta($data->ID, 'FASE_event_date', true) . get_post_meta($data->ID, 'FASE_event_date_start', true);
                        $startTime = date("M j, Y g:s A", strtotime($targetTime));
                        $postDate = $startTime;
    
                        if (get_post_meta($data->ID, 'FASE_event_date_end', true) != '') {
                            $targetTime = get_post_meta($data->ID, 'FASE_event_date_end', true);
                            $postDate .= " to " . $targetTime;
                        }
                    }
    
                    $image = get_the_post_thumbnail($data->ID, 'full', array('class' => 'img-responsive'));
                    if ($image == "") {
                        $image = '<img src="' . get_template_directory_uri() . '/images/fpo_300x200.jpg' . '" class="img-responsive"/>';
                    }
                    ?>
                    <div class="col-lg-3 col-md-3 col-sm-6 col-xs-6 eventContainer">
                        <a href='<?php echo get_permalink($data->ID); ?>'>
                            <?php echo $image; ?>
                            <h4><?php echo $data->post_title; ?></h4>
                            <p><?php echo $postDate; ?></p>
                        </a>
                    </div>
                    <?php
                }
                ?>
            </div>
            <?php
        }
    }
    ?>

    Additionally, I’d like the events to stop displaying once they’ve passed.

Viewing 1 replies (of 1 total)
  • Thread Starter megseoh

    (@megseoh)

    I found a solution that works for me. It involves 2 different arrays – 1 to display events in the current year, followed by 1 to display events in the upcoming year:

    <div class="container-fluid current-year">
        <div class="row">
            <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
                <?php
                $eventArray = array();
    
                $currentMonth = date('n');
                $currentYear = date('Y');
                $currentTime = strtotime(date('Y-m-d'));
    
                //Generate our months from the system time.
                for ($i = $currentMonth; $i <= 12; $i++) {
                    $monthName = date('F', mktime(0, 0, 0, $i, 10)); // March
                    $eventArray[$monthName] = array();
                }
    
                $returnData = '';
    
                //Custom Post-Type Events
                $args = array(
                    'posts_per_page' => -1,
                    'offset' => 0,
                    'category' => '',
                    'orderby' => 'post_date',
                    'order' => 'ASC',
                    'include' => '',
                    'exclude' => '',
                    'meta_key' => 'FASE_event_date',
                    'orderby' => 'meta_value',
                    'post_type' => 'events',
                    'post_mime_type' => '',
                    'post_parent' => '',
                    'post_status' => 'publish',
                    'suppress_filters' => true
                );
                // register post type to display columns in admin screen
                register_post_type( 'event' , $args );
    
                $allData = get_posts($args);
    
                //Search through all our data and sort into months
                foreach ($allData as $data) {
                    $postDate = strtotime(get_post_meta($data->ID, 'FASE_event_date', true));
                    // Get the year for each event
                    $postYear = date('Y', $postDate);
                    // Check to see if the event is occurring in the future & if the index exists. If so, then populate that data.
                    if (($postYear === $currentYear) && ($postDate >= $currentTime) && (array_key_exists(date("F", $postDate), $eventArray))) {
                        array_push($eventArray[date("F", $postDate)], $data);
                    }
                }
    
                foreach ($eventArray as $key => $arrayData) {
                    if (count($arrayData) > 0) {
                        ?>
                        <h2><?php echo $key . ' ' . $currentYear; ?></h2>
                        <div class="row">
                            <?php
    
                            foreach ($arrayData as $data) {
                                if (get_post_meta($data->ID, 'FASE_endDate', true) != "") {
                                    $startDay = get_post_meta($data->ID, 'FASE_event_date', true);
                                    $endDay = get_post_meta($data->ID, 'FASE_endDate', true);
    
                                    $postDate = date("M j, Y", strtotime($startDay)) . " to " . date("M j, Y", strtotime($endDay));
                                } else {
                                    $targetTime = get_post_meta($data->ID, 'FASE_event_date', true) . get_post_meta($data->ID, 'FASE_event_date_start', true);
                                    $startTime = date("M j, Y g:i A", strtotime($targetTime));
                                    $postDate = $startTime;
    
                                    if (get_post_meta($data->ID, 'FASE_event_date_end', true) != '') {
                                        $targetTime = get_post_meta($data->ID, 'FASE_event_date_end', true);
                                        $postDate .= " to " . $targetTime;
                                    }
                                }
    
                                $image = get_the_post_thumbnail($data->ID, 'event-thumb-200', array('class' => 'img-responsive'));
                                if ($image == "") {
                                    $image = '<img src="' . get_template_directory_uri() . '/images/default-calendar-event-orange.jpg' . '" class="img-responsive"/>';
                                }
                                ?>
                                <div class="col-lg-3 col-md-3 col-sm-6 col-xs-6 eventContainer">
                                    <a href='<?php echo get_permalink($data->ID); ?>'>
                                        <?php echo $image; ?>
                                        <h4><?php echo $data->post_title; ?></h4>
                                        <p><?php echo $postDate; ?></p>
                                    </a>
                                </div>
                                <?php
                            }
                            ?>
                        </div>
                        <?php
                    }
                }
                ?>
            </div>
        </div>
    </div>
    
    <div class="container-fluid next-year">
        <div class="row">
            <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
                <?php
                $eventArray = array();
    
                $currentMonth = date('n');
                $currentYear = date('Y');
                $currentTime = strtotime(date('Y-m-d'));
    
                $nextYear = date('Y') + 1;
    
                //Generate our months from the system time.
                for ($i = 0; $i <= 12; $i++) {
                    $monthName = date('F', mktime(0, 0, 0, $i, 10)); // March
                    $eventArray[$monthName] = array();
                }
    
                $returnData = '';
    
                //Custom Post-Type Events
                $args = array(
                    'posts_per_page' => -1,
                    'offset' => 0,
                    'category' => '',
                    'orderby' => 'post_date',
                    'order' => 'ASC',
                    'include' => '',
                    'exclude' => '',
                    'meta_key' => 'FASE_event_date',
                    'orderby' => 'meta_value',
                    'post_type' => 'events',
                    'post_mime_type' => '',
                    'post_parent' => '',
                    'post_status' => 'publish',
                    'suppress_filters' => true
                );
                // register post type to display columns in admin screen
                register_post_type( 'event' , $args );
    
                $allData = get_posts($args);
    
                //Search through all our data and sort into months
                foreach ($allData as $data) {
                    $postDate = strtotime(get_post_meta($data->ID, 'FASE_event_date', true));
                    // Get the year for each event
                    $postYear = date('Y', $postDate);
                    // if the year for our event is greater than the current year, eg. 2017 > 2016 add it to the array
                    if (($postYear > $currentYear) && (array_key_exists(date("F", $postDate), $eventArray))) {
                        array_push($eventArray[date("F", $postDate)], $data);
                    }
                }
    
                foreach ($eventArray as $key => $arrayData) {
                    if (count($arrayData) > 0) {
                        ?>
                        <h2><?php echo $key . ' ' . $nextYear; ?></h2>
                        <div class="row">
                            <?php
    
                            foreach ($arrayData as $data) {
                                if (get_post_meta($data->ID, 'FASE_endDate', true) != "") {
                                    $startDay = get_post_meta($data->ID, 'FASE_event_date', true);
                                    $endDay = get_post_meta($data->ID, 'FASE_endDate', true);
    
                                    $postDate = date("M j, Y", strtotime($startDay)) . " to " . date("M j, Y", strtotime($endDay));
                                } else {
                                    $targetTime = get_post_meta($data->ID, 'FASE_event_date', true) . get_post_meta($data->ID, 'FASE_event_date_start', true);
                                    $startTime = date("M j, Y g:i A", strtotime($targetTime));
                                    $postDate = $startTime;
    
                                    if (get_post_meta($data->ID, 'FASE_event_date_end', true) != '') {
                                        $targetTime = get_post_meta($data->ID, 'FASE_event_date_end', true);
                                        $postDate .= " to " . $targetTime;
                                    }
                                }
    
                                $image = get_the_post_thumbnail($data->ID, 'event-thumb-200', array('class' => 'img-responsive'));
                                if ($image == "") {
                                    $image = '<img src="' . get_template_directory_uri() . '/images/default-calendar-event-orange.jpg' . '" class="img-responsive"/>';
                                }
                                ?>
                                <div class="col-lg-3 col-md-3 col-sm-6 col-xs-6 eventContainer">
                                    <a href='<?php echo get_permalink($data->ID); ?>'>
                                        <?php echo $image; ?>
                                        <h4><?php echo $data->post_title; ?></h4>
                                        <p><?php echo $postDate; ?></p>
                                    </a>
                                </div>
                                <?php
                            }
                            ?>
                        </div>
                        <?php
                    }
                }
                ?>
            </div>
        </div>
    </div>
Viewing 1 replies (of 1 total)

The topic ‘Custom Post Type Event Displaying Incorrect Year’ is closed to new replies.