PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / widgets / upcoming-events.php
jetpack / modules / widgets Last commit date
authors 7 months ago contact-info 7 months ago eu-cookie-law 7 months ago facebook-likebox 11 years ago flickr 7 months ago gallery 7 months ago goodreads 7 months ago google-translate 1 year ago image-widget 7 months ago instagram 4 months ago internet-defense-league 1 year ago milestone 4 months ago my-community 7 months ago social-icons 4 months ago social-media-icons 7 months ago top-posts 7 months ago wordpress-post-widget 2 weeks ago authors.php 7 months ago blog-stats.php 7 months ago class-jetpack-eu-cookie-law-widget.php 1 month ago class-jetpack-instagram-widget.php 6 months ago contact-info.php 1 month ago customizer-controls.css 7 months ago customizer-utils.js 1 year ago facebook-likebox.php 1 month ago flickr.php 7 months ago gallery.php 1 month ago goodreads.php 1 month ago google-translate.php 1 month ago gravatar-profile.css 7 months ago gravatar-profile.php 1 month ago image-widget.php 7 months ago internet-defense-league.php 7 months ago mailchimp.php 7 months ago milestone.php 7 months ago my-community.php 1 month ago rsslinks-widget.php 2 weeks ago simple-payments.php 7 months ago social-icons.php 1 month ago social-media-icons.php 7 months ago top-posts.php 1 month ago twitter-timeline-admin.js 1 year ago twitter-timeline.php 2 weeks ago upcoming-events.php 7 months ago wordpress-post-widget.php 7 months ago
upcoming-events.php
201 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Upcoming Events widget
4 *
5 * It relies on the icalendar-reader library.
6 *
7 * @package automattic/jetpack
8 */
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit( 0 );
12 }
13
14 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
15
16 /**
17 * Register the widget.
18 */
19 function upcoming_events_register_widgets() {
20 register_widget( Jetpack_Upcoming_Events_Widget::class );
21 }
22 add_action( 'widgets_init', 'upcoming_events_register_widgets' );
23
24 /**
25 * Widget class.
26 */
27 class Jetpack_Upcoming_Events_Widget extends WP_Widget {
28 /**
29 * Constructor
30 */
31 public function __construct() {
32 parent::__construct(
33 'upcoming_events_widget',
34 /** This filter is documented in modules/widgets/facebook-likebox.php */
35 apply_filters( 'jetpack_widget_name', __( 'Upcoming Events', 'jetpack' ) ),
36 array(
37 'description' => __( 'Display upcoming events from an iCalendar feed.', 'jetpack' ),
38 'customize_selective_refresh' => true,
39 )
40 );
41 if ( is_active_widget( false, false, $this->id_base ) ) {
42 add_action( 'wp_head', array( $this, 'css' ) );
43 }
44 }
45
46 /**
47 * Output CSS in the header everywhere where the widget is active.
48 */
49 public function css() {
50 ?>
51 <style type="text/css">
52 .upcoming-events li {
53 margin-bottom: 10px;
54 }
55 .upcoming-events li span {
56 display: block;
57 }
58 </style>
59 <?php
60 }
61
62 /**
63 * Displays the form for this widget on the Widgets page of the WP Admin area.
64 *
65 * @param array $instance Instance configuration.
66 *
67 * @return string|void
68 */
69 public function form( $instance ) {
70 $defaults = array(
71 'title' => __( 'Upcoming Events', 'jetpack' ),
72 'feed-url' => '',
73 'count' => 3,
74 );
75 $instance = array_merge( $defaults, (array) $instance );
76 ?>
77
78 <p>
79 <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title:', 'jetpack' ); ?></label>
80 <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
81 </p>
82
83 <p>
84 <label for="<?php echo esc_attr( $this->get_field_id( 'feed-url' ) ); ?>"><?php esc_html_e( 'iCalendar Feed URL:', 'jetpack' ); ?></label>
85 <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'feed-url' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'feed-url' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['feed-url'] ); ?>" />
86 </p>
87
88 <p>
89 <label for="<?php echo esc_attr( $this->get_field_id( 'count' ) ); ?>"><?php esc_html_e( 'Items to show:', 'jetpack' ); ?></label>
90 <select id="<?php echo esc_attr( $this->get_field_id( 'count' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>">
91 <?php for ( $i = 1; $i <= 10; $i++ ) { ?>
92 <option <?php selected( $instance['count'], $i ); ?>><?php echo esc_html( (string) $i ); ?></option>
93 <?php } ?>
94 <option value="0" <?php selected( $instance['count'], 0 ); ?>><?php esc_html_e( 'All', 'jetpack' ); ?></option>
95 </select>
96 </p>
97 <?php
98 }
99
100 /**
101 * Deals with the settings when they are saved by the admin.
102 *
103 * @param array $new_instance New configuration values.
104 * @param array $old_instance Old configuration values.
105 *
106 * @return array
107 */
108 public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
109 $instance = array();
110 $instance['title'] = wp_strip_all_tags( $new_instance['title'] );
111 $instance['feed-url'] = wp_strip_all_tags( $new_instance['feed-url'] );
112 $instance['count'] = min( absint( $new_instance['count'] ), 10 ); // 10 or less
113 return $instance;
114 }
115
116 /**
117 * Outputs the HTML for this widget.
118 *
119 * @param array $args An array of standard parameters for widgets in this theme.
120 * @param array $instance An array of settings for this widget instance.
121 *
122 * @return void Echoes it's output
123 */
124 public function widget( $args, $instance ) {
125 require_once JETPACK__PLUGIN_DIR . '/_inc/lib/icalendar-reader.php';
126
127 $ical = new iCalendarReader();
128 $events = array();
129 if ( ! empty( $instance['feed-url'] ) ) {
130 $events = $ical->get_events( $instance['feed-url'], $instance['count'] );
131 $events = $this->apply_timezone_offset( $events );
132 }
133 $ical->timezone = null;
134
135 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
136 if ( ! empty( $instance['title'] ) ) {
137 echo $args['before_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
138 echo esc_html( $instance['title'] );
139 echo $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
140 }
141
142 if ( empty( $instance['feed-url'] ) ) {
143 if ( current_user_can( 'manage_options' ) ) {
144 echo '<div class="error-message">';
145 esc_html_e( 'The events feed URL is not properly set up in this widget.', 'jetpack' );
146 echo '</div>';
147 }
148 } elseif ( ! $events ) {
149 echo '<p>';
150 esc_html_e( 'No upcoming events', 'jetpack' );
151 echo '</p>';
152 } else {
153 ?>
154 <ul class="upcoming-events">
155 <?php foreach ( $events as $event ) : ?>
156 <li>
157 <strong class="event-summary">
158 <?php
159 echo $ical->escape( stripslashes( $event['SUMMARY'] ?? '' ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- this method is built to escape.
160 ?>
161 </strong>
162 <span class="event-when"><?php echo esc_html( $ical->formatted_date( $event ) ); ?></span>
163 <?php if ( ! empty( $event['LOCATION'] ) ) : ?>
164 <span class="event-location">
165 <?php
166 echo $ical->escape( stripslashes( $event['LOCATION'] ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- this method is built to escape.
167 ?>
168 </span>
169 <?php endif; ?>
170 <?php if ( ! empty( $event['DESCRIPTION'] ) ) : ?>
171 <span class="event-description">
172 <?php
173 echo wp_trim_words( $ical->escape( stripcslashes( $event['DESCRIPTION'] ) ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- this method is built to escape.
174 ?>
175 </span>
176 <?php endif; ?>
177 </li>
178 <?php endforeach; ?>
179 </ul>
180 <?php
181 }
182
183 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
184
185 /** This action is documented in modules/widgets/gravatar-profile.php */
186 do_action( 'jetpack_stats_extra', 'widget_view', 'upcoming_events' );
187 }
188
189 /**
190 * Left this function here for backward compatibility
191 * just incase a site using jetpack is also using this function
192 *
193 * @param array|false $events Array of events, false on failure.
194 */
195 private function apply_timezone_offset( $events ) {
196 require_once JETPACK__PLUGIN_DIR . '/_inc/lib/icalendar-reader.php';
197
198 return ( new iCalendarReader() )->apply_timezone_offset( $events );
199 }
200 }
201