Last active
December 4, 2021 01:23
-
-
Save tomfinitely/9c17251119368f35547c to your computer and use it in GitHub Desktop.
The Events Calendar Pro - Cross-site Events Widget
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
if ( ! defined( 'ABSPATH' ) ) die('-1'); | |
/* | |
* WDG-customized version of the Events Calendar Pro mini calendar widget. | |
* Changes are noted inline. | |
* Replacing class name: Tribe__Events__Pro__Mini_CalendarWidget | |
*/ | |
class MultisiteTribeEventsProMiniCalendarWidget extends WP_Widget { | |
function __construct() { | |
// @M new classname | |
$widget_ops = array( 'classname' => 'multisite_tribe_mini_calendar_widget', | |
'description' => __( 'The events calendar mini calendar widget', 'tribe-events-calendar-pro' ) ); | |
// @M new widget slug, widget name | |
parent::__construct( 'multisite-tribe-mini-calendar', __( 'University Events Calendar', 'tribe-events-calendar-pro' ), $widget_ops ); | |
add_action( 'admin_enqueue_scripts', array( $this, 'load_scripts' ) ); | |
} | |
public function load_scripts( $hook ) { | |
if ( $hook != 'widgets.php' ) { | |
return; | |
} | |
Tribe__Events__Template_Factory::asset_package( 'select2' ); | |
wp_enqueue_script( 'calendar-widget-admin', tribe_events_pro_resource_url( 'calendar-widget-admin.js' ), array(), apply_filters( 'tribe_events_pro_js_version', Tribe__Events__Pro__Main::VERSION ) ); | |
} | |
function widget( $args, $instance ) { | |
$ecp = Tribe__Events__Pro__Main::instance(); | |
$tooltip_status = $ecp->recurring_info_tooltip_status(); | |
$ecp->disable_recurring_info_tooltip(); | |
add_filter( 'tribe_events_list_show_ical_link', '__return_false' ); | |
echo $args['before_widget']; | |
$defaults = array( | |
'title' => __( 'Events Calendar', 'tribe-events-calendar-pro' ), | |
'count' => 5, | |
'filters' => null, | |
'operand' => 'OR', | |
); | |
$instance = wp_parse_args( (array) $instance, $defaults ); | |
// @M switch to blog 1 for taxonomy query | |
global $blog_id; | |
if($blog_id != 1) { | |
switch_to_blog(1); | |
} | |
$filters = isset( $instance['raw_filters'] ) ? $instance['raw_filters'] : json_decode( $instance['filters'] ); | |
$tax_query = Tribe__Events__Pro__Widgets::form_tax_query( $filters, $instance['operand'] ); | |
do_action( 'tribe_events_mini_cal_before_the_title' ); | |
echo ( $instance['title'] ) ? $args['before_title'] . $instance['title'] . $args['after_title'] : ''; | |
do_action( 'tribe_events_mini_cal_after_the_title' ); | |
$instance['tax_query'] = $tax_query; | |
Tribe__Events__Pro__Mini_Calendar::instance()->do_calendar( $instance ); | |
echo $args['after_widget']; | |
remove_filter( 'tribe_events_list_show_ical_link', '__return_false' ); | |
if ( $tooltip_status ) { | |
$ecp->enable_recurring_info_tooltip(); | |
} | |
// @M switch back if needed | |
if(ms_is_switched()) { | |
restore_current_blog(); | |
} | |
} | |
function update( $new_instance, $old_instance ) { | |
$instance = $old_instance; | |
$instance['title'] = strip_tags( $new_instance['title'] ); | |
$instance['count'] = intval( strip_tags( $new_instance['count'] ) ); | |
$instance['operand'] = strip_tags( $new_instance['operand'] ); | |
$instance['filters'] = maybe_unserialize( $new_instance['filters'] ); | |
return $instance; | |
} | |
function form( $instance ) { | |
$defaults = array( | |
'title' => __( 'Events Calendar', 'tribe-events-calendar-pro' ), | |
'layout' => 'tall', | |
'count' => 5, | |
'operand' => 'OR', | |
'filters' => null, | |
); | |
$instance = wp_parse_args( (array) $instance, $defaults ); | |
// @M switch to blog 1 for taxonomy query | |
global $blog_id; | |
if($blog_id != 1) { | |
switch_to_blog(1); | |
} | |
$taxonomies = get_object_taxonomies( Tribe__Events__Main::POSTTYPE, 'objects' ); | |
$taxonomies = array_reverse( $taxonomies ); | |
$ts = Tribe__Events__Pro__Main::instance(); | |
include $ts->pluginPath . 'src/admin-views/widget-calendar.php'; | |
// @M switch back if needed | |
if(ms_is_switched()) { | |
restore_current_blog(); | |
} | |
} | |
} | |
/* | |
* WDG-customized version of the Events Calendar Pro events list widget. | |
* Changes are noted inline. | |
* Replacing class name: TribeEventsListWidget | |
*/ | |
class MultisiteTribeEventsListWidget extends WP_Widget | |
{ | |
/** | |
* Allows widgets extending this one to pass through their own unique name, ID base etc. | |
* | |
* @param string $id_base | |
* @param string $name | |
* @param array $widget_options | |
* @param array $control_options | |
*/ | |
public function __construct($id_base = '', $name = '', $widget_options = array(), $control_options = array()) | |
{ | |
$widget_options = array_merge(array( | |
// @M new classname | |
'classname' => 'multisite-tribe-events-list-widget', | |
'description' => __('A widget that displays upcoming events.', 'tribe-events-calendar')), | |
$widget_options | |
); | |
// @M new widget slug | |
$control_options = array_merge(array('id_base' => 'multisite-tribe-events-list-widget'), $control_options); | |
// @M new widget slug | |
$id_base = empty($id_base) ? 'multisite-tribe-events-list-widget' : $id_base; | |
// @M new widget name | |
$name = empty($name) ? __('University Events List', 'tribe-events-calendar') : $name; | |
parent::__construct($id_base, $name, $widget_options, $control_options); | |
} | |
/** | |
* The main widget output function. | |
* | |
* @param array $args | |
* @param array $instance | |
* @return string The widget output (html). | |
*/ | |
function widget($args, $instance) | |
{ | |
return $this->widget_output($args, $instance); | |
} | |
/** | |
* The main widget output function (called by the class's widget() function). | |
* | |
* @param array $args | |
* @param array $instance | |
* @param string $template_name The template name. | |
* @param string $subfolder The subfolder where the template can be found. | |
* @param string $namespace The namespace for the widget template stuff. | |
* @param string $pluginPath The pluginpath so we can locate the template stuff. | |
*/ | |
function widget_output($args, $instance, $template_name = 'pro/widgets/list-widget.php') | |
{ | |
global $wp_query, $tribe_ecp, $post; | |
$instance = wp_parse_args($instance, array( | |
'limit' => 5, | |
'title' => '' | |
)); | |
/** | |
* @var $after_title | |
* @var $after_widget | |
* @var $before_title | |
* @var $before_widget | |
* @var $limit | |
* @var $no_upcoming_events | |
* @var $title | |
*/ | |
extract($args, EXTR_SKIP); | |
extract($instance, EXTR_SKIP); | |
// Temporarily unset the tribe bar params so they don't apply | |
$hold_tribe_bar_args = array(); | |
foreach ($_REQUEST as $key => $value) { | |
if ($value && strpos($key, 'tribe-bar-') === 0) { | |
$hold_tribe_bar_args[$key] = $value; | |
unset($_REQUEST[$key]); | |
} | |
} | |
$title = apply_filters('widget_title', $title); | |
if (!function_exists('tribe_get_events')) return; | |
// @M switch to blog 1 for events query | |
global $blog_id; | |
if($blog_id != 1) { | |
switch_to_blog(1); | |
} | |
$posts = tribe_get_events(apply_filters('tribe_events_list_widget_query_args', array( | |
'eventDisplay' => 'upcoming', | |
'posts_per_page' => $limit | |
))); | |
// If no posts, and the don't show if no posts checked, let's bail | |
if (!$posts && $no_upcoming_events) return; | |
echo $before_widget; | |
do_action('tribe_events_before_list_widget'); | |
do_action('tribe_events_list_widget_before_the_title'); | |
echo ($title) ? $before_title . $title . $after_title : ''; | |
do_action('tribe_events_list_widget_after_the_title'); | |
// Include template file | |
include TribeEventsTemplates::getTemplateHierarchy($template_name); | |
do_action('tribe_events_after_list_widget'); | |
echo $after_widget; | |
wp_reset_query(); | |
// Reinstate the tribe bar params | |
if (!empty($hold_tribe_bar_args)) | |
foreach ($hold_tribe_bar_args as $key => $value) | |
$_REQUEST[$key] = $value; | |
// @M switch back if needed | |
if(ms_is_switched()) { | |
restore_current_blog(); | |
} | |
} | |
/** | |
* The function for saving widget updates in the admin section. | |
* | |
* @param array $new_instance | |
* @param array $old_instance | |
* @return array The new widget settings. | |
*/ | |
function update($new_instance, $old_instance) | |
{ | |
$instance = $old_instance; | |
/* Strip tags (if needed) and update the widget settings. */ | |
$instance['title'] = strip_tags($new_instance['title']); | |
$instance['limit'] = $new_instance['limit']; | |
$instance['no_upcoming_events'] = $new_instance['no_upcoming_events']; | |
return $instance; | |
} | |
/** | |
* Output the admin form for the widget. | |
* | |
* @param array $instance | |
* @return string The output for the admin widget form. | |
*/ | |
function form($instance) | |
{ | |
/* Set up default widget settings. */ | |
$defaults = array('title' => __('Upcoming Events', 'tribe-events-calendar'), 'limit' => '5', 'no_upcoming_events' => false); | |
$instance = wp_parse_args((array)$instance, $defaults); | |
// @M switch to blog 1 for events query | |
global $blog_id; | |
if($blog_id != 1) { | |
switch_to_blog(1); | |
} | |
$tribe_ecp = TribeEvents::instance(); | |
include($tribe_ecp->pluginPath . 'src/admin-views/widget-admin-list.php'); | |
// @M switch back if needed | |
if(ms_is_switched()) { | |
restore_current_blog(); | |
} | |
} | |
} | |
/* | |
* WDG-customized version of the Events Calendar Pro events list (pro version) widget | |
* The pro version and free version of this widget is kept split to ease the update process (if needed) | |
* Changes are noted inline. | |
* Replacing class name: TribeEventsAdvancedListWidget originally extending TribeEventsListWidget | |
*/ | |
class MultisiteTribeEventsAdvancedListWidget extends MultisiteTribeEventsListWidget { | |
/** | |
* @var array | |
*/ | |
public $instance = array(); | |
public function __construct() { | |
$widget_ops = array( | |
// @M new classname | |
'classname' => 'multisite-tribe-events-adv-list-widget', | |
'description' => __( 'A widget that displays the next upcoming x events.', 'tribe-events-calendar-pro' ) ); | |
// @M new widget slug | |
$control_ops = array( 'id_base' => 'multisite-tribe-events-adv-list-widget' ); | |
// @M new widget name | |
parent::__construct( 'multisite-tribe-events-adv-list-widget', __( 'University Events List', 'tribe-events-calendar-pro' ), $widget_ops, $control_ops ); | |
add_filter( 'tribe_events_list_widget_query_args', array( $this, 'taxonomy_filters' ) ); | |
// Do not enqueue if the widget is inactive | |
if ( is_active_widget( false, false, $this->id_base, true ) ) { | |
add_action( 'init', array( $this, 'enqueue_stylesheet' ), 100 ); | |
} | |
} | |
/** | |
* If the widget is active then enqueue our stylesheet. | |
*/ | |
public function enqueue_stylesheet() { | |
// Load the calendar widget CSS (the list widget inherits much of the same) | |
Tribe__Events__Pro__Widgets::enqueue_calendar_widget_styles(); | |
} | |
public function taxonomy_filters( $query ) { | |
if ( empty( $this->instance ) ) { | |
return $query; | |
} | |
$filters = isset( $this->instance['raw_filters'] ) ? $this->instance['raw_filters'] : json_decode( $this->instance['filters'] ); | |
$tax_query = Tribe__Events__Pro__Widgets::form_tax_query( $filters, $this->instance['operand'] ); | |
if ( isset( $query['tax_query'] ) ) { | |
$query['tax_query'] = array_merge( $query['tax_query'], $tax_query ); | |
} else { | |
$query['tax_query'] = $tax_query; | |
} | |
return $query; | |
} | |
public function widget( $args, $instance ) { | |
// @M switch to blog 1 for events widget instance | |
global $blog_id; | |
if($blog_id != 1) { | |
switch_to_blog(1); | |
} | |
$ecp = Tribe__Events__Pro__Main::instance(); | |
$tooltip_status = $ecp->recurring_info_tooltip_status(); | |
$ecp->disable_recurring_info_tooltip(); | |
$this->instance_defaults( $instance ); | |
// @todo remove after 3.7 (continuity helper for upgrading users) | |
if ( isset( $this->instance['category'] ) ) { | |
$this->include_cat_id( $this->instance['filters'], $this->instance['category'] ); | |
} | |
parent::widget_output( $args, $this->instance, 'pro/widgets/list-widget' ); | |
if ( $tooltip_status ) { | |
$ecp->enable_recurring_info_tooltip(); | |
} | |
// @M switch back if needed | |
if(ms_is_switched()) { | |
restore_current_blog(); | |
} | |
} | |
public function update( $new_instance, $old_instance ) { | |
$instance = parent::update( $new_instance, $old_instance ); | |
$instance['venue'] = $new_instance['venue']; | |
$instance['country'] = $new_instance['country']; | |
$instance['address'] = $new_instance['address']; | |
$instance['city'] = $new_instance['city']; | |
$instance['region'] = $new_instance['region']; | |
$instance['zip'] = $new_instance['zip']; | |
$instance['phone'] = $new_instance['phone']; | |
$instance['cost'] = $new_instance['cost']; | |
$instance['organizer'] = $new_instance['organizer']; | |
$instance['operand'] = strip_tags( $new_instance['operand'] ); | |
$instance['filters'] = maybe_unserialize( $new_instance['filters'] ); | |
// @todo remove after 3.7 (added for continuity when users transition from 3.5.x or earlier to this release) | |
if ( isset( $old_instance['category'] ) ) { | |
$this->include_cat_id( $instance['filters'], $old_instance['category'] ); | |
unset( $instance['category'] ); | |
} | |
return $instance; | |
} | |
public function form( $instance ) { | |
$this->instance_defaults( $instance ); | |
$this->include_cat_id( $this->instance['filters'], $this->instance['category'] ); // @todo remove after 3.7 | |
// @M switch to blog 1 for events taxonomy query | |
global $blog_id; | |
if($blog_id != 1) { | |
switch_to_blog(1); | |
} | |
$taxonomies = get_object_taxonomies( Tribe__Events__Main::POSTTYPE, 'objects' ); | |
$taxonomies = array_reverse( $taxonomies ); | |
$instance = $this->instance; | |
include( Tribe__Events__Pro__Main::instance()->pluginPath . 'src/admin-views/widget-admin-advanced-list.php' ); | |
// @M switch back if needed | |
if(ms_is_switched()) { | |
restore_current_blog(); | |
} | |
} | |
protected function instance_defaults( $instance ) { | |
$this->instance = $this->default_instance_args( (array) $instance ); | |
} | |
/** | |
* Returns the instance arguments padded out with default values. If optional | |
* param $empty_values is specified, then it simply ensures that the expected keys | |
* are present - not that they are set to their default values. | |
* | |
* @param array $instance | |
* @param bool $empty_values | |
* | |
* @return array | |
*/ | |
protected function default_instance_args( array $instance, $empty_values = false ) { | |
$defaults = array( | |
'title' => __( 'Upcoming Events', 'tribe-events-calendar-pro' ), | |
'limit' => '5', | |
'no_upcoming_events' => false, | |
'venue' => false, | |
'country' => true, | |
'address' => false, | |
'city' => true, | |
'region' => true, | |
'zip' => false, | |
'phone' => false, | |
'cost' => false, | |
'organizer' => false, | |
'operand' => 'OR', | |
'filters' => '', | |
'instance' => &$this->instance, | |
); | |
if ( $empty_values ) { | |
$defaults = array_map( '__return_empty_string', $defaults ); | |
} | |
return wp_parse_args( (array) $instance, $defaults ); | |
} | |
/** | |
* Adds the provided category ID to the list of filters. | |
* | |
* In 3.6 taxonomy filters were added to this widget (as already existed for the calendar | |
* widget): this helper exists to provide some continuity for users upgrading from a 3.5.x | |
* release or earlier, transitioning any existing category setting to the new filters | |
* list. | |
* | |
* @todo remove after 3.7 | |
* @param mixed &$filters | |
* @param int $id | |
*/ | |
protected function include_cat_id( &$filters, $id ) { | |
$id = (string) absint( $id ); // An absint for sanity but a string for comparison purposes | |
$tax = Tribe__Events__Main::TAXONOMY; | |
if ( '0' === $id || ! is_string( $filters ) ) { | |
return; | |
} | |
$filters = (array) json_decode( $filters, true ); | |
if ( isset( $filters[ $tax ] ) && ! in_array( $id, $filters[ $tax ] ) ) { | |
$filters[ $tax ][] = $id; | |
} elseif ( ! isset( $filters[ $tax ] ) ) { | |
$filters[ $tax ] = array( $id ); | |
} | |
$filters = json_encode( $filters ); | |
} | |
} | |
// @M Registering new widgets | |
/* | |
* Add new events widgets | |
*/ | |
add_action( 'widgets_init', 'su_add_multisite_events_widgets', 99 ); | |
function su_add_multisite_events_widgets() | |
{ | |
register_widget( 'MultisiteTribeEventsProMiniCalendarWidget' ); | |
register_widget( 'MultisiteTribeEventsAdvancedListWidget' ); | |
} | |
// @M All following lines are for customizing which widgets are available | |
/* | |
* Unregister unused events widgets | |
*/ | |
function su_unregister_multisite_events_widgets() { | |
unregister_widget( 'TribeCountdownWidget' ); | |
} | |
add_action( 'widgets_init', 'su_unregister_multisite_events_widgets', 99 ); | |
/* | |
* Remove action for unused events widgets | |
*/ | |
remove_action( 'widgets_init', 'tribe_venue_register_widget', 100 ); | |
// @M Registering new widgets | |
/* | |
* Buy link addition to events on all sites. | |
*/ | |
if(function_exists("register_field_group")) | |
{ | |
register_field_group(array ( | |
'id' => 'acf_events-fields', | |
'title' => 'Events Fields', | |
'fields' => array ( | |
array ( | |
'key' => 'field_5411b3e0ad4c3', | |
'label' => 'Buy Link', | |
'name' => 'buy_link', | |
'type' => 'text', | |
'instructions' => 'Insert a url for purchasing tickets if applicable.', | |
'default_value' => '', | |
'placeholder' => '', | |
'prepend' => '', | |
'append' => '', | |
'formatting' => 'none', | |
'maxlength' => '', | |
), | |
), | |
'location' => array ( | |
array ( | |
array ( | |
'param' => 'post_type', | |
'operator' => '==', | |
'value' => 'tribe_events', | |
'order_no' => 0, | |
'group_no' => 0, | |
), | |
), | |
), | |
'options' => array ( | |
'position' => 'side', | |
'layout' => 'no_box', | |
'hide_on_screen' => array ( | |
), | |
), | |
'menu_order' => 0, | |
)); | |
} | |
/* | |
* Delete during cleanup | |
*/ | |
// Testing multisite events blog switch | |
//add_action( 'tribe_events_parse_query', 'su_test_events'); | |
/* | |
add_action( 'tribe_events_pre_get_posts', 'su_test_events'); | |
add_action( 'wp', 'su_restore_events'); | |
function su_test_events($query) { | |
global $blog_id; | |
if($blog_id != 1) { | |
switch_to_blog(1); | |
} | |
print '<pre>'; | |
print_r($query); | |
print '</pre>'; | |
} | |
function su_restore_events() { | |
if(ms_is_switched()) { | |
restore_current_blog(); | |
} | |
} | |
*/ | |
/* | |
add_action('tribe_cpt_filters_init', 'su_events_switch_blog'); | |
add_action('tribe_cpt_filters_after_init', 'su_events_switch_back'); | |
function su_events_switch_blog() { | |
global $blog_id; | |
if($blog_id != 1) { | |
switch_to_blog(1); | |
} | |
} | |
function su_events_switch_back() { | |
restore_current_blog(); | |
} | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Updated 9/2/2016 to reflect appropriate path/classname updates, etc. made by Modern Tribe.