For future reference:
I am using the great Meta Box Plugin to help expedite meta box creation for my custom post types.
My goal:
To build a highly customizable events section closely resembling a traditional calendar like get_calendar
creates, but for a specific custom post type.
The Problem:
— By relying solely on using WordPresses built in time parameters, I am able to return my posts in an ASC order similar to a traditional calendar but I am limited to only showing posts up to the current day since there is no way to query and return scheduled posts – this is an issue obviously since I need to display ALL event posts for the current month, and onward…
— Additionally, I also need to be able to page to “previous” and “upcoming” months similar to get_calendar
.
My Solution Thus Far:
— Due to the time parameter restrictions, I’ve opted to return my posts via WP_Query
‘s meta_key
parameter instead and assigned it to my events “startdate” field, and then orderby – meta_value_num
…
This seems to replicate the same functionality Im after for the most part but now I’m posed with a serious issue of:
“how do i treat this meta value just like wordpresses native time parameters so that I can store this data appropriately for each month and have the option to page through the months similar to the get_calendar archive?”
Hopefully I was definitive enough in my explanation to help anyone who reads this make sense of it all. If not, please let me know and I will happily attempt to further clarify whatever it is…and thank you for the help!
Pasted below is my current “Calendar/Events” template as well as a screenshot of how it will most likely look on the front end.
<?php
/*
Template Name: Calendar
*/
?>
<?php get_header(); ?>
<!-- featured_images.php -->
<?php include ('featured_images.php'); ?>
<div id="full_col">
<h2 class="feed_title_full"><?php wp_title('', true); ?></h2>
<div id="calendar_nav">
<h4 id="current_month"><?php the_time( 'F Y' ); ?></h4>
</div>
<ul id="calendar">
<?php $current_year = date('Y'); // Get current YEAR ?>
<?php $current_month = date('m'); // Get current MONTH ?>
<?php $calandar_posts = new WP_Query(
array(
'post_type' => 'calendar',
'year' => $current_year,
'monthnum' => $current_month, // Show ALL posts for current Month
'meta_key' => 'epr_startdate',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'posts_per_page' => -1,
'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
));
?>
<?php if($calandar_posts->have_posts()) : while($calandar_posts->have_posts()) : $calandar_posts->the_post(); ?>
<li class="calendar_entry">
<a href="<?php the_permalink(); ?>" class="calendar_link" title="<?php the_title_attribute(); ?>"></a>
<div class="entry_date">
<?php echo get_post_meta($post->ID, 'epr_startdate', TRUE); ?>
</div>
<div class="shadow_overlay"></div>
<?php the_post_thumbnail('calendar-teaser', array('class' => 'calendar-teaser-img', 'alt' => 'View Event')); ?>
</li>
<?php endwhile; else: ?>
<h2>No Events for the month of <?php the_time( 'F' ); ?></h2>
<?php endif; ?>
<?php wp_reset_query(); ?>
</ul>
</div>
<?php get_footer(); ?>
This isn’t complete copy/paste code, but hopefully it’s understandable enough to get you started.
First step is to register your post type and add a rewrite rule to handle years/months. This will give you single events at
event/post-name/
, your post type archive atcalendar
, and handle incoming requests forcalendar/yyyy/mm/
. Make sure to visit your Settings > Permalinks page after this is added to flush the rewrite rules.Next step is to add the
calendar_year
andcalendar_month
query vars so WordPress adds them to the array of query vars when the incoming requests are parsed.The next step is to add an action to
pre_get_posts
, which checks if it’s the calendar post type archive, fetches the year/month or sets it to the current year/month, then modifies the query withmeta_query
parameters to load the requested year/month. SeeWP_Query
for more info on meta queries. This assumes a date format ofyyyymmdd
.The last step will be for you to build the calendar in your template and create the next/previous links to page through months. You can get the queried year/month in the template via
get_query_var
.EDIT – Here’s an example of building the links with plain ol’ math