PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.7.3
Jetpack – WP Security, Backup, Speed, & Growth v12.7.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 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 8 years ago contact-info 5 years ago eu-cookie-law 2 years ago facebook-likebox 11 years ago flickr 2 years ago gallery 4 years ago goodreads 5 years ago google-translate 4 years ago image-widget 8 years ago instagram 6 years ago internet-defense-league 3 years ago migrate-to-core 3 years ago milestone 2 years ago my-community 8 years ago simple-payments 4 years ago social-icons 4 years ago social-media-icons 5 years ago top-posts 8 years ago wordpress-post-widget 3 years ago authors.php 3 years ago blog-stats.php 2 years ago class-jetpack-eu-cookie-law-widget.php 3 years ago class-jetpack-instagram-widget.php 2 years ago contact-info.php 2 years ago customizer-controls.css 9 years ago customizer-utils.js 6 years ago facebook-likebox.php 3 years ago flickr.php 3 years ago gallery.php 3 years ago goodreads.php 3 years ago google-translate.php 2 years ago gravatar-profile.css 10 years ago gravatar-profile.php 3 years ago image-widget.php 3 years ago internet-defense-league.php 3 years ago mailchimp.php 3 years ago milestone.php 5 years ago my-community.php 2 years ago rsslinks-widget.php 3 years ago simple-payments.php 2 years ago social-icons.php 2 years ago social-media-icons.php 3 years ago top-posts.php 2 years ago twitter-timeline-admin.js 6 years ago twitter-timeline.php 3 years ago upcoming-events.php 3 years ago wordpress-post-widget.php 4 years ago
my-community.php
313 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;
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 if ( is_active_widget( false, false, $this->id_base ) || is_active_widget( false, false, 'monster' ) || is_customize_preview() ) {
48 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_style' ) );
49 }
50
51 $this->default_title = esc_html__( 'Community', 'jetpack' );
52
53 add_filter( 'widget_types_to_hide_from_legacy_widget_block', array( $this, 'hide_widget_in_block_editor' ) );
54 }
55
56 /**
57 * Remove the "My Community" widget from the Legacy Widget block
58 *
59 * @param array $widget_types List of widgets that are currently removed from the Legacy Widget block.
60 * @return array $widget_types New list of widgets that will be removed.
61 */
62 public function hide_widget_in_block_editor( $widget_types ) {
63 $widget_types[] = 'jetpack_my_community';
64 return $widget_types;
65 }
66
67 /**
68 * Enqueue stylesheet for grid layout.
69 */
70 public function enqueue_style() {
71 wp_register_style( 'jetpack-my-community-widget', plugins_url( 'my-community/style.css', __FILE__ ), array(), '20160129' );
72 wp_enqueue_style( 'jetpack-my-community-widget' );
73 }
74
75 /**
76 * Back end widget form.
77 *
78 * @see WP_Widget::form()
79 *
80 * @param array $instance Previously saved values from database.
81 *
82 * @return string|void
83 */
84 public function form( $instance ) {
85 $title = isset( $instance['title'] ) ? $instance['title'] : false;
86 if ( false === $title ) {
87 $title = $this->default_title;
88 }
89
90 $number = isset( $instance['number'] ) ? (int) $instance['number'] : 10;
91 if ( ! in_array( $number, array( 10, 50 ), true ) ) {
92 $number = 10;
93 }
94
95 $include_likers = isset( $instance['include_likers'] ) ? (bool) $instance['include_likers'] : true;
96 $include_followers = isset( $instance['include_followers'] ) ? (bool) $instance['include_followers'] : true;
97 $include_commenters = isset( $instance['include_commenters'] ) ? (bool) $instance['include_commenters'] : true;
98 ?>
99
100 <p>
101 <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title:', 'jetpack' ); ?></label>
102 <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 ); ?>" />
103 </p>
104
105 <p>
106 <label><?php esc_html_e( 'Show a maximum of', 'jetpack' ); ?></label>
107 </p>
108 <ul>
109 <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>
110 <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>
111 </ul>
112
113 <p>
114 <label for="<?php echo esc_attr( $this->get_field_id( 'include_likers' ) ); ?>">
115 <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 ); ?> />
116 <?php esc_html_e( 'Include activity from likers', 'jetpack' ); ?>
117 </label>
118 </p>
119
120 <p>
121 <label for="<?php echo esc_attr( $this->get_field_id( 'include_followers' ) ); ?>">
122 <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 ); ?> />
123 <?php esc_html_e( 'Include activity from followers', 'jetpack' ); ?>
124 </label>
125 </p>
126
127 <p>
128 <label for="<?php echo esc_attr( $this->get_field_id( 'include_commenters' ) ); ?>">
129 <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 ); ?> />
130 <?php esc_html_e( 'Include activity from commenters', 'jetpack' ); ?>
131 </label>
132 </p>
133
134 <?php
135 }
136
137 /**
138 * Sanitize widget form values as they are saved.
139 *
140 * @see WP_Widget::update()
141 *
142 * @param array $new_instance Values just sent to be saved.
143 * @param array $old_instance Previously saved values from database.
144 *
145 * @return array Updated safe values to be saved.
146 */
147 public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
148 $instance = array();
149 $instance['title'] = wp_kses( $new_instance['title'], array() );
150 if ( $instance['title'] === $this->default_title ) {
151 $instance['title'] = false; // Store as false in case of language change.
152 }
153
154 $instance['number'] = (int) $new_instance['number'];
155 if ( ! in_array( $instance['number'], array( 10, 50 ), true ) ) {
156 $instance['number'] = 10;
157 }
158
159 $instance['include_likers'] = (bool) $new_instance['include_likers'];
160 $instance['include_followers'] = (bool) $new_instance['include_followers'];
161 $instance['include_commenters'] = (bool) $new_instance['include_commenters'];
162
163 delete_transient( "$this->id-v2-{$instance['number']}" . (int) $instance['include_likers'] . (int) $instance['include_followers'] . (int) $instance['include_commenters'] );
164
165 return $instance;
166 }
167
168 /**
169 * Front-end display of widget.
170 *
171 * @see WP_Widget::widget()
172 *
173 * @param array $args Widget arguments.
174 * @param array $instance Saved values from database.
175 */
176 public function widget( $args, $instance ) {
177 $instance = wp_parse_args(
178 $instance,
179 array(
180 'title' => false,
181 'number' => true,
182 'include_likers' => true,
183 'include_followers' => true,
184 'include_commenters' => true,
185 )
186 );
187
188 $title = $instance['title'];
189
190 if ( false === $title ) {
191 $title = $this->default_title;
192 }
193
194 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
195
196 /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
197 $title = apply_filters( 'widget_title', $title );
198 if ( ! empty( $title ) ) {
199 echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
200 }
201
202 $transient_name = "$this->id-v2-{$instance['number']}" . (int) $instance['include_likers'] . (int) $instance['include_followers'] . (int) $instance['include_commenters'];
203
204 $my_community = get_transient( $transient_name );
205
206 if ( empty( $my_community ) ) {
207 $my_community = $this->get_community( $instance );
208
209 set_transient( $transient_name, $my_community, self::$expiration );
210 }
211
212 echo $my_community; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
213
214 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
215
216 /** This action is documented in modules/widgets/gravatar-profile.php */
217 do_action( 'jetpack_stats_extra', 'widget_view', 'my_community' );
218 }
219
220 /**
221 * Initiate request and render the response.
222 *
223 * @since 4.0
224 *
225 * @param array $query Saved widget values from database.
226 *
227 * @return string
228 */
229 private function get_community( $query ) {
230 $members = $this->fetch_remote_community( $query );
231
232 if ( ! empty( $members ) ) {
233
234 $my_community = '<div class="widgets-multi-column-grid"><ul>';
235
236 foreach ( $members as $member ) {
237 $my_community .= sprintf(
238 '<li><a href="%s" title="%s"><img alt="%s" src="%s" class="avatar avatar-48" height="48" width="48"></a></li>',
239 esc_url( $member->profile_URL ), // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
240 esc_attr( $member->name ),
241 esc_attr( $member->name ),
242 esc_url( $member->avatar_URL ) // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
243 );
244 }
245
246 $my_community .= '</ul></div>';
247
248 } elseif ( current_user_can( 'edit_theme_options' ) ) {
249 $my_community = '<p>' . wp_kses(
250 sprintf(
251 /* Translators: 1. link to the widgets settings screen. 2. link to support document. */
252 __( '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' ),
253 admin_url( 'widgets.php' ),
254 esc_url( Redirect::get_url( 'jetpack-support-getting-more-views-and-traffic' ) )
255 ),
256 array( 'a' => array( 'href' => true ) )
257 ) . '</p>';
258 } else {
259 $my_community = '<p>' . esc_html__( "I'm just starting out; leave me a comment or a like :)", 'jetpack' ) . '</p>';
260 }
261
262 return $my_community;
263 }
264
265 /**
266 * Request community members to WordPress.com endpoint.
267 *
268 * @since 4.0
269 *
270 * @param array $query Saved widget values from database.
271 *
272 * @return array
273 */
274 private function fetch_remote_community( $query ) {
275 $jetpack_blog_id = Jetpack_Options::get_option( 'id' );
276 $url = add_query_arg(
277 array(
278 'number' => $query['number'],
279 'likers' => (int) $query['include_likers'],
280 'followers' => (int) $query['include_followers'],
281 'commenters' => (int) $query['include_commenters'],
282 ),
283 "https://public-api.wordpress.com/rest/v1.1/sites/$jetpack_blog_id/community"
284 );
285 $response = wp_remote_get( $url );
286 $response_body = wp_remote_retrieve_body( $response );
287
288 if ( empty( $response_body ) ) {
289 return array();
290 }
291
292 $response_body = json_decode( $response_body );
293
294 if ( isset( $response_body->users ) ) {
295 return $response_body->users;
296 }
297
298 return array();
299 }
300 }
301
302 /**
303 * If site is connected to WordPress.com, register the widget.
304 *
305 * @since 4.0
306 */
307 function jetpack_my_community_init() {
308 if ( Jetpack::is_connection_ready() ) {
309 register_widget( 'Jetpack_My_Community_Widget' );
310 }
311 }
312 add_action( 'widgets_init', 'jetpack_my_community_init' );
313