Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
This is a copy of the original EE upcoming events widget that includes a field to allow you to select the order of the events and also include a 'Show Only Expire' option within the show expired dropdown. This option will only show events in which the event end date has already passed.
<?php
/*
Plugin Name: Custom EE Upcoming Events Widget
Description: Add a custom Upcoming Events widger with a 'sort' field and 'Show Only Expired' option.
Author: Tony Warwick
Version: 1.1
*/
/* Begin Adding Functions Below This Line; Do not include an opening PHP tag as this sample code already includes one! */
class Custom_Upcoming_Events extends WP_Widget {
/**
* Register widget with WordPress.
*/
function __construct() {
parent::__construct(
'ee-custom-upcoming-events-widget',
__( 'Custom Event Espresso Upcoming Events', 'event_espresso' ),
array( 'description' => __( 'A custom widget to display your upcoming events.', 'event_espresso' )),
array(
'width' => 300,
'height' => 350,
'id_base' => 'ee-custom-upcoming-events-widget'
)
);
}
/**
* Back-end widget form.
*
* @see WP_Widget::form()
* @param array $instance Previously saved values from database.
* @return string|void
*/
public function form( $instance ) {
EE_Registry::instance()->load_helper( 'Form_Fields' );
EE_Registry::instance()->load_class( 'Question_Option', array(), FALSE, FALSE, TRUE );
// Set up some default widget settings.
$defaults = array(
'title' => __('Upcoming Events', 'event_espresso'),
'category_name' => '',
'show_expired' => 0,
'show_desc' => TRUE,
'show_dates' => TRUE,
'show_everywhere' => FALSE,
'date_limit' => 2,
'limit' => 10,
'sort' => 'ASC',
'date_range' => FALSE,
'image_size' => 'medium'
);
$instance = wp_parse_args( (array) $instance, $defaults );
// don't add HTML labels for EE_Form_Fields generated inputs
add_filter( 'FHEE__EEH_Form_Fields__label_html', '__return_empty_string' );
$yes_no_values = array(
EE_Question_Option::new_instance( array( 'QSO_value' => FALSE, 'QSO_desc' => __('No', 'event_espresso'))),
EE_Question_Option::new_instance( array( 'QSO_value' => TRUE, 'QSO_desc' => __('Yes', 'event_espresso'))),
);
$sort_values = array(
EE_Question_Option::new_instance( array( 'QSO_value' => 'ASC', 'QSO_desc' => __('ASC', 'event_espresso'))),
EE_Question_Option::new_instance( array( 'QSO_value' => 'DESC', 'QSO_desc' => __('DESC', 'event_espresso')))
);
?>
<!-- Widget Title: Text Input -->
<p>
<label for="<?php echo $this->get_field_id('title'); ?>">
<?php _e('Title:', 'event_espresso'); ?>
</label>
<input id="<?php echo $this->get_field_id('title'); ?>" class="widefat" name="<?php echo $this->get_field_name('title'); ?>" value="<?php echo esc_attr( $instance['title'] ); ?>" type="text" />
</p>
<p>
<label for="<?php echo $this->get_field_id('category_name'); ?>">
<?php _e('Event Category:', 'event_espresso'); ?>
</label>
<?php
$event_categories = array();
/** @type EEM_Term $EEM_Term */
$EEM_Term = EE_Registry::instance()->load_model( 'Term' );
$categories = $EEM_Term->get_all_ee_categories( TRUE );
if ( $categories ) {
foreach ( $categories as $category ) {
if ( $category instanceof EE_Term ) {
$event_categories[] = EE_Question_Option::new_instance( array( 'QSO_value' => $category->get( 'slug' ), 'QSO_desc' => $category->get( 'name' )));
}
}
}
array_unshift( $event_categories, EE_Question_Option::new_instance( array( 'QSO_value' => '', 'QSO_desc' => __(' - display all - ', 'event_espresso'))));
echo EEH_Form_Fields::select(
__('Event Category:', 'event_espresso'),
$instance['category_name'],
$event_categories,
$this->get_field_name('category_name'),
$this->get_field_id('category_name')
);
?>
</p>
<p>
<label for="<?php echo $this->get_field_id('limit'); ?>">
<?php _e('Number of Events to Display:', 'event_espresso'); ?>
</label>
<input id="<?php echo $this->get_field_id('limit'); ?>" name="<?php echo $this->get_field_name('limit'); ?>" value="<?php echo $instance['limit']; ?>" size="3" type="text" />
</p>
<p>
<label for="<?php echo $this->get_field_id('show_expired'); ?>">
<?php _e('Show Expired Events:', 'event_espresso'); ?>
</label>
<?php
echo EEH_Form_Fields::select(
__('Show Expired Events:', 'event_espresso'),
$instance['show_expired'],
array(
EE_Question_Option::new_instance( array( 'QSO_value' => 0, 'QSO_desc' => __('No', 'event_espresso'))),
EE_Question_Option::new_instance( array( 'QSO_value' => 1, 'QSO_desc' => __('Yes', 'event_espresso'))),
EE_Question_Option::new_instance( array( 'QSO_value' => 2, 'QSO_desc' => __('Show Only Expired', 'event_espresso'))),
),
$this->get_field_name('show_expired'),
$this->get_field_id('show_expired')
);
?>
</p>
<p>
<label for="<?php echo $this->get_field_id('sort'); ?>">
<?php _e('Sort Events:', 'event_espresso'); ?>
</label>
<?php
echo EEH_Form_Fields::select(
__('Sort Events:', 'event_espresso'),
$instance['sort'],
$sort_values,
$this->get_field_name('sort'),
$this->get_field_id('sort')
);
?>
</p>
<p>
<label for="<?php echo $this->get_field_id('image_size'); ?>">
<?php _e('Image Size:', 'event_espresso'); ?>
</label>
<?php
$image_sizes = array();
$sizes = get_intermediate_image_sizes();
if ( $sizes ) {
// loop thru images and create option objects out of them
foreach ( $sizes as $image_size ) {
$image_size = trim( $image_size );
// no big images plz
if ( ! in_array( $image_size, array( 'large', 'post-thumbnail' ))) {
$image_sizes[] = EE_Question_Option::new_instance( array( 'QSO_value' => $image_size, 'QSO_desc' => $image_size ));
}
}
$image_sizes[] = EE_Question_Option::new_instance( array( 'QSO_value' => 'none', 'QSO_desc' => __('don\'t show images', 'event_espresso') ));
}
echo EEH_Form_Fields::select(
__('Image Size:', 'event_espresso'),
$instance['image_size'],
$image_sizes,
$this->get_field_name('image_size'),
$this->get_field_id('image_size')
);
?>
</p>
<p>
<label for="<?php echo $this->get_field_id('show_desc'); ?>">
<?php _e('Show Description:', 'event_espresso'); ?>
</label>
<?php
echo EEH_Form_Fields::select(
__('Show Description:', 'event_espresso'),
$instance['show_desc'],
$yes_no_values,
$this->get_field_name('show_desc'),
$this->get_field_id('show_desc')
);
?>
</p>
<p>
<label for="<?php echo $this->get_field_id('show_dates'); ?>">
<?php _e('Show Dates:', 'event_espresso'); ?>
</label>
<?php
echo EEH_Form_Fields::select(
__('Show Dates:', 'event_espresso'),
$instance['show_dates'],
$yes_no_values,
$this->get_field_name('show_dates'),
$this->get_field_id('show_dates')
);
?>
</p>
<p>
<label for="<?php echo $this->get_field_id('show_everywhere'); ?>">
<?php _e('Show on all Pages:', 'event_espresso'); ?>
</label>
<?php
echo EEH_Form_Fields::select(
__('Show on all Pages:', 'event_espresso'),
$instance['show_everywhere'],
$yes_no_values,
$this->get_field_name('show_everywhere'),
$this->get_field_id('show_everywhere')
);
?>
</p>
<p>
<label for="<?php echo $this->get_field_id('date_limit'); ?>">
<?php _e('Number of Dates to Display:', 'event_espresso'); ?>
</label>
<input id="<?php echo $this->get_field_id('date_limit'); ?>" name="<?php echo $this->get_field_name('date_limit'); ?>" value="<?php echo esc_attr( $instance['date_limit'] ); ?>" size="3" type="text" />
</p>
<p>
<label for="<?php echo $this->get_field_id('date_range'); ?>">
<?php _e('Show Date Range:', 'event_espresso'); ?>
</label>
<?php
echo EEH_Form_Fields::select(
__('Show Date Range:', 'event_espresso'),
$instance['date_range'],
$yes_no_values,
$this->get_field_name('date_range'),
$this->get_field_id('date_range')
);
?><span class="description"><br /><?php _e('This setting will replace the list of dates in the widget.', 'event_espresso'); ?></span>
</p>
<?php
}
/**
* Sanitize widget form values as they are saved.
*
* @see WP_Widget::update()
*
* @param array $new_instance Values just sent to be saved.
* @param array $old_instance Previously saved values from database.
*
* @return array Updated safe values to be saved.
*/
public function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['title'] = ! empty( $new_instance['title'] ) ? strip_tags( $new_instance['title'] ) : '';
$instance['category_name'] = $new_instance['category_name'];
$instance['show_expired'] = $new_instance['show_expired'];
$instance['limit'] = $new_instance['limit'];
$instance['sort'] = $new_instance['sort'];
$instance['image_size'] = $new_instance['image_size'];
$instance['show_desc'] = $new_instance['show_desc'];
$instance['show_dates'] = $new_instance['show_dates'];
$instance['show_everywhere'] = $new_instance['show_everywhere'];
$instance['date_limit'] = $new_instance['date_limit'];
$instance['date_range'] = $new_instance['date_range'];
return $instance;
}
/**
* Front-end display of widget.
*
* @see WP_Widget::widget()
*
* @param array $args Widget arguments.
* @param array $instance Saved values from database.
*/
public function widget( $args, $instance ) {
global $post;
// make sure there is some kinda post object
if ( $post instanceof WP_Post ) {
$before_widget = '';
$before_title = '';
$after_title = '';
$after_widget = '';
// but NOT an events archives page, cuz that would be like two event lists on the same page
$show_everywhere = isset( $instance['show_everywhere'] ) ? (bool) absint( $instance['show_everywhere'] ) : TRUE;
if ( $show_everywhere || ! ( $post->post_type == 'espresso_events' && is_archive() )) {
// let's use some of the event helper functions'
EE_Registry::instance()->load_helper( 'Event_View' );
// make separate vars out of attributes
extract($args);
// add function to make the title a link
add_filter('widget_title', array($this, 'make_the_title_a_link'), 15);
// filter the title
$title = apply_filters('widget_title', $instance['title']);
// remove the function from the filter, so it does not affect other widgets
remove_filter('widget_title', array($this, 'make_the_title_a_link'), 15);
// Before widget (defined by themes).
echo $before_widget;
// Display the widget title if one was input (before and after defined by themes).
if ( ! empty( $title )) {
echo $before_title . $title . $after_title;
}
// grab widget settings
$category = isset( $instance['category_name'] ) && ! empty( $instance['category_name'] ) ? $instance['category_name'] : FALSE;
$show_expired = isset( $instance['show_expired'] ) ? absint( $instance['show_expired'] ) : 0;
$image_size = isset( $instance['image_size'] ) && ! empty( $instance['image_size'] ) ? $instance['image_size'] : 'medium';
$show_desc = isset( $instance['show_desc'] ) ? (bool) absint( $instance['show_desc'] ) : TRUE;
$show_dates = isset( $instance['show_dates'] ) ? (bool) absint( $instance['show_dates'] ) : TRUE;
$date_limit = isset( $instance['date_limit'] ) && ! empty( $instance['date_limit'] ) ? $instance['date_limit'] : NULL;
$date_range = isset( $instance['date_range'] ) && ! empty( $instance['date_range'] ) ? $instance['date_range'] : FALSE;
// start to build our where clause
$where = array(
//'Datetime.DTT_is_primary' => 1,
'status' => array( 'IN', array( 'publish', 'sold_out' ) )
);
// add category
if ( $category ) {
$where['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
$where['Term_Taxonomy.Term.slug'] = $category;
}
// if NOT show expired then we want events that start today or in the future
if ( $show_expired == 0 ) {
$where['Datetime.DTT_EVT_end'] = array( '>=', EEM_Datetime::instance()->current_time_for_query( 'DTT_EVT_end' ) );
}
// if show ONLY expired we want events that ended prior to today
if ( $show_expired == 2 ) {
$where['Datetime.DTT_EVT_end'] = array( '<=', EEM_Datetime::instance()->current_time_for_query( 'DTT_EVT_start' ) );
}
// run the query
$events = EE_Registry::instance()->load_model( 'Event' )->get_all( array(
$where,
'limit' => $instance['limit'] > 0 ? '0,' . $instance['limit'] : '0,10',
'order_by' => 'Datetime.DTT_EVT_start',
'order' => isset($instance['sort']) ? $instance['sort'] : 'ASC',
'group_by' => 'EVT_ID'
));
if ( ! empty( $events )) {
echo '<ul class="ee-upcoming-events-widget-ul">';
foreach ( $events as $event ) {
if ( $event instanceof EE_Event && ( !is_single() || $post->ID != $event->ID() ) ) {
//printr( $event, '$event <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
echo '<li id="ee-upcoming-events-widget-li-' . $event->ID() . '" class="ee-upcoming-events-widget-li">';
// how big is the event name ?
$name_length = strlen( $event->name() );
switch( $name_length ) {
case $name_length > 70 :
$len_class = ' three-line';
break;
case $name_length > 35 :
$len_class = ' two-line';
break;
default :
$len_class = ' one-line';
}
echo '<h5 class="ee-upcoming-events-widget-title-h5"><a class="ee-widget-event-name-a' . $len_class . '" href="' . get_permalink( $event->ID() ) . '">' . $event->name() . '</a></h5>';
if ( has_post_thumbnail( $event->ID() ) && $image_size != 'none' ) {
echo '<div class="ee-upcoming-events-widget-img-dv"><a class="ee-upcoming-events-widget-img" href="' . get_permalink( $event->ID() ) . '">' . get_the_post_thumbnail( $event->ID(), $image_size ) . '</a></div>';
}
$desc = $event->short_description( 25 );
if ( $show_dates ) {
$date_format = apply_filters( 'FHEE__espresso_event_date_range__date_format', get_option( 'date_format' ));
$time_format = apply_filters( 'FHEE__espresso_event_date_range__time_format', get_option( 'time_format' ));
$single_date_format = apply_filters( 'FHEE__espresso_event_date_range__single_date_format', get_option( 'date_format' ));
$single_time_format = apply_filters( 'FHEE__espresso_event_date_range__single_time_format', get_option( 'time_format' ));
if ( $date_range == TRUE ) {
echo espresso_event_date_range( $date_format, $time_format, $single_date_format, $single_time_format, $event->ID() );
}else{
echo espresso_list_of_event_dates( $event->ID(), $date_format, $time_format, FALSE, NULL, TRUE, TRUE, $date_limit );
}
}
if ( $show_desc && $desc ) {
echo '<p style="margin-top: .5em">' . $desc . '</p>';
}
echo '</li>';
}
}
echo '</ul>';
}
// After widget (defined by themes).
echo $after_widget;
}
}
}
/**
* make_the_title_a_link
* callback for widget_title filter
*
* @param $title
* @return string
*/
public function make_the_title_a_link($title) {
return '<a href="' . EEH_Event_View::event_archive_url() . '">' . $title . '</a>';
}
}
function tw_load_custom_upcoming_events_widget() {
register_widget( 'Custom_Upcoming_Events' );
}
add_action( 'widgets_init', 'tw_load_custom_upcoming_events_widget' );
@ChrisScottUK

This comment has been minimized.

Copy link

ChrisScottUK commented Nov 24, 2015

Hi Tony,
I noticed that the title isn't displayed from this widget. I've copied some code over from the original widget to fix it. Could you consider updating this gist from this fork
https://gist.github.com/ChrisScottUK/1d10cf3ea4ebc75def27

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.