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 / my-community.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
my-community.php
312 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
4
5 use Automattic\Jetpack\Redirect;
6
7 // Disable direct access/execution to/of the widget code.
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit( 0 );
10 }
11
12 /**
13 * Jetpack_My_Community_Widget displays community members of this site.
14 *
15 * A community member is a WordPress.com user that liked or commented on an entry or subscribed to the site.
16 * Requires WordPress.com connection to work. Otherwise it won't be visible in Widgets screen in admin.
17 */
18 class Jetpack_My_Community_Widget extends WP_Widget {
19 /**
20 * Transient expiration time.
21 *
22 * @var int $expiration
23 */
24 public static $expiration = 600;
25
26 /**
27 * Default widget title.
28 *
29 * @var string $default_title
30 */
31 public $default_title;
32
33 /**
34 * Registers the widget with WordPress.
35 */
36 public function __construct() {
37 parent::__construct(
38 'jetpack_my_community', // Base ID.
39 /** This filter is documented in modules/widgets/facebook-likebox.php */
40 apply_filters( 'jetpack_widget_name', esc_html__( 'My Community', 'jetpack' ) ),
41 array(
42 'description' => esc_html__( "Display members of your site's community.", 'jetpack' ),
43 'customize_selective_refresh' => true,
44 )
45 );
46
47 $this->default_title = esc_html__( 'Community', 'jetpack' );
48
49 add_filter( 'widget_types_to_hide_from_legacy_widget_block', array( $this, 'hide_widget_in_block_editor' ) );
50 }
51
52 /**
53 * Remove the "My Community" widget from the Legacy Widget block
54 *
55 * @param array $widget_types List of widgets that are currently removed from the Legacy Widget block.
56 * @return array $widget_types New list of widgets that will be removed.
57 */
58 public function hide_widget_in_block_editor( $widget_types ) {
59 $widget_types[] = 'jetpack_my_community';
60 return $widget_types;
61 }
62
63 /**
64 * Enqueue stylesheet for grid layout.
65 */
66 public function enqueue_style() {
67 wp_register_style( 'jetpack-my-community-widget', plugins_url( 'my-community/style.css', __FILE__ ), array(), '20160129' );
68 wp_enqueue_style( 'jetpack-my-community-widget' );
69 }
70
71 /**
72 * Back end widget form.
73 *
74 * @see WP_Widget::form()
75 *
76 * @param array $instance Previously saved values from database.
77 *
78 * @return string|void
79 */
80 public function form( $instance ) {
81 $title = $instance['title'] ?? false;
82 if ( false === $title ) {
83 $title = $this->default_title;
84 }
85
86 $number = isset( $instance['number'] ) ? (int) $instance['number'] : 10;
87 if ( ! in_array( $number, array( 10, 50 ), true ) ) {
88 $number = 10;
89 }
90
91 $include_likers = isset( $instance['include_likers'] ) ? (bool) $instance['include_likers'] : true;
92 $include_followers = isset( $instance['include_followers'] ) ? (bool) $instance['include_followers'] : true;
93 $include_commenters = isset( $instance['include_commenters'] ) ? (bool) $instance['include_commenters'] : true;
94 ?>
95
96 <p>
97 <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title:', 'jetpack' ); ?></label>
98 <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( $title ); ?>" />
99 </p>
100
101 <p>
102 <label><?php esc_html_e( 'Show a maximum of', 'jetpack' ); ?></label>
103 </p>
104 <ul>
105 <li><label><input id="<?php echo esc_attr( $this->get_field_id( 'number' ) ); ?>-few" name="<?php echo esc_attr( $this->get_field_name( 'number' ) ); ?>" type="radio" value="10" <?php checked( '10', $number ); ?> /> <?php esc_html_e( '10 community members', 'jetpack' ); ?></label></li>
106 <li><label><input id="<?php echo esc_attr( $this->get_field_id( 'number' ) ); ?>-lots" name="<?php echo esc_attr( $this->get_field_name( 'number' ) ); ?>" type="radio" value="50" <?php checked( '50', $number ); ?> /> <?php esc_html_e( '50 community members', 'jetpack' ); ?></label></li>
107 </ul>
108
109 <p>
110 <label for="<?php echo esc_attr( $this->get_field_id( 'include_likers' ) ); ?>">
111 <input type="checkbox" class="checkbox" id="<?php echo esc_attr( $this->get_field_id( 'include_likers' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'include_likers' ) ); ?>" value="1" <?php checked( $include_likers, 1 ); ?> />
112 <?php esc_html_e( 'Include activity from likers', 'jetpack' ); ?>
113 </label>
114 </p>
115
116 <p>
117 <label for="<?php echo esc_attr( $this->get_field_id( 'include_followers' ) ); ?>">
118 <input type="checkbox" class="checkbox" id="<?php echo esc_attr( $this->get_field_id( 'include_followers' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'include_followers' ) ); ?>" value="1" <?php checked( $include_followers, 1 ); ?> />
119 <?php esc_html_e( 'Include activity from followers', 'jetpack' ); ?>
120 </label>
121 </p>
122
123 <p>
124 <label for="<?php echo esc_attr( $this->get_field_id( 'include_commenters' ) ); ?>">
125 <input type="checkbox" class="checkbox" id="<?php echo esc_attr( $this->get_field_id( 'include_commenters' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'include_commenters' ) ); ?>" value="1" <?php checked( $include_commenters, 1 ); ?> />
126 <?php esc_html_e( 'Include activity from commenters', 'jetpack' ); ?>
127 </label>
128 </p>
129
130 <?php
131 }
132
133 /**
134 * Sanitize widget form values as they are saved.
135 *
136 * @see WP_Widget::update()
137 *
138 * @param array $new_instance Values just sent to be saved.
139 * @param array $old_instance Previously saved values from database.
140 *
141 * @return array Updated safe values to be saved.
142 */
143 public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
144 $instance = array();
145 $instance['title'] = wp_kses( $new_instance['title'], array() );
146 if ( $instance['title'] === $this->default_title ) {
147 $instance['title'] = false; // Store as false in case of language change.
148 }
149
150 $instance['number'] = (int) $new_instance['number'];
151 if ( ! in_array( $instance['number'], array( 10, 50 ), true ) ) {
152 $instance['number'] = 10;
153 }
154
155 $instance['include_likers'] = (bool) $new_instance['include_likers'];
156 $instance['include_followers'] = (bool) $new_instance['include_followers'];
157 $instance['include_commenters'] = (bool) $new_instance['include_commenters'];
158
159 delete_transient( "$this->id-v2-{$instance['number']}" . (int) $instance['include_likers'] . (int) $instance['include_followers'] . (int) $instance['include_commenters'] );
160
161 return $instance;
162 }
163
164 /**
165 * Front-end display of widget.
166 *
167 * @see WP_Widget::widget()
168 *
169 * @param array $args Widget arguments.
170 * @param array $instance Saved values from database.
171 */
172 public function widget( $args, $instance ) {
173 $instance = wp_parse_args(
174 $instance,
175 array(
176 'title' => false,
177 'number' => true,
178 'include_likers' => true,
179 'include_followers' => true,
180 'include_commenters' => true,
181 )
182 );
183
184 $title = $instance['title'];
185
186 if ( false === $title ) {
187 $title = $this->default_title;
188 }
189
190 // Enqueue front end assets.
191 $this->enqueue_style();
192
193 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
194
195 /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
196 $title = apply_filters( 'widget_title', $title );
197 if ( ! empty( $title ) ) {
198 echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
199 }
200
201 $transient_name = "$this->id-v2-{$instance['number']}" . (int) $instance['include_likers'] . (int) $instance['include_followers'] . (int) $instance['include_commenters'];
202
203 $my_community = get_transient( $transient_name );
204
205 if ( empty( $my_community ) ) {
206 $my_community = $this->get_community( $instance );
207
208 set_transient( $transient_name, $my_community, self::$expiration );
209 }
210
211 echo $my_community; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
212
213 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
214
215 /** This action is documented in modules/widgets/gravatar-profile.php */
216 do_action( 'jetpack_stats_extra', 'widget_view', 'my_community' );
217 }
218
219 /**
220 * Initiate request and render the response.
221 *
222 * @since 4.0
223 *
224 * @param array $query Saved widget values from database.
225 *
226 * @return string
227 */
228 private function get_community( $query ) {
229 $members = $this->fetch_remote_community( $query );
230
231 if ( ! empty( $members ) ) {
232
233 $my_community = '<div class="widgets-multi-column-grid"><ul>';
234
235 foreach ( $members as $member ) {
236 $my_community .= sprintf(
237 '<li><a href="%s" title="%s"><img alt="%s" src="%s" class="avatar avatar-48" height="48" width="48"></a></li>',
238 esc_url( $member->profile_URL ), // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
239 esc_attr( $member->name ),
240 esc_attr( $member->name ),
241 esc_url( $member->avatar_URL ) // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
242 );
243 }
244
245 $my_community .= '</ul></div>';
246
247 } elseif ( current_user_can( 'edit_theme_options' ) ) {
248 $my_community = '<p>' . wp_kses(
249 sprintf(
250 /* Translators: 1. link to the widgets settings screen. 2. link to support document. */
251 __( 'There are no users to display in this <a href="%1$s">My Community widget</a>. <a href="%2$s">Want more traffic?</a>', 'jetpack' ),
252 admin_url( 'widgets.php' ),
253 esc_url( Redirect::get_url( 'jetpack-support-getting-more-views-and-traffic' ) )
254 ),
255 array( 'a' => array( 'href' => true ) )
256 ) . '</p>';
257 } else {
258 $my_community = '<p>' . esc_html__( "I'm just starting out; leave me a comment or a like :)", 'jetpack' ) . '</p>';
259 }
260
261 return $my_community;
262 }
263
264 /**
265 * Request community members to WordPress.com endpoint.
266 *
267 * @since 4.0
268 *
269 * @param array $query Saved widget values from database.
270 *
271 * @return array
272 */
273 private function fetch_remote_community( $query ) {
274 $jetpack_blog_id = Jetpack_Options::get_option( 'id' );
275 $url = add_query_arg(
276 array(
277 'number' => $query['number'],
278 'likers' => (int) $query['include_likers'],
279 'followers' => (int) $query['include_followers'],
280 'commenters' => (int) $query['include_commenters'],
281 ),
282 "https://public-api.wordpress.com/rest/v1.1/sites/$jetpack_blog_id/community"
283 );
284 $response = wp_remote_get( $url );
285 $response_body = wp_remote_retrieve_body( $response );
286
287 if ( empty( $response_body ) ) {
288 return array();
289 }
290
291 $response_body = json_decode( $response_body );
292
293 if ( isset( $response_body->users ) ) {
294 return $response_body->users;
295 }
296
297 return array();
298 }
299 }
300
301 /**
302 * If site is connected to WordPress.com, register the widget.
303 *
304 * @since 4.0
305 */
306 function jetpack_my_community_init() {
307 if ( Jetpack::is_connection_ready() ) {
308 register_widget( 'Jetpack_My_Community_Widget' );
309 }
310 }
311 add_action( 'widgets_init', 'jetpack_my_community_init' );
312