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