PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.9.2
Jetpack – WP Security, Backup, Speed, & Growth v13.9.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 / authors.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 2 years ago goodreads 2 years ago google-translate 4 years ago image-widget 8 years ago instagram 6 years ago internet-defense-league 2 years ago migrate-to-core 3 years ago milestone 2 years ago my-community 8 years ago simple-payments 2 years ago social-icons 4 years ago social-media-icons 5 years ago top-posts 8 years ago wordpress-post-widget 2 years ago authors.php 3 years ago blog-stats.php 2 years ago class-jetpack-eu-cookie-law-widget.php 2 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 2 years ago flickr.php 2 years ago gallery.php 2 years ago goodreads.php 2 years ago google-translate.php 2 years ago gravatar-profile.css 10 years ago gravatar-profile.php 2 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 2 years ago top-posts.php 2 years ago twitter-timeline-admin.js 6 years ago twitter-timeline.php 3 years ago upcoming-events.php 2 years ago wordpress-post-widget.php 4 years ago
authors.php
310 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Disable direct access/execution to/of the widget code.
4 */
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit;
7 }
8
9 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
10
11 /**
12 * Widget to display blog authors with avatars and recent posts.
13 *
14 * Configurable parameters include:
15 * 1. Whether to display authors who haven't written any posts
16 * 2. The number of posts to be displayed per author (defaults to 0)
17 * 3. Avatar size
18 *
19 * @since 4.5.0
20 */
21 class Jetpack_Widget_Authors extends WP_Widget {
22 /**
23 * Jetpack_Widget_Authors contructor.
24 */
25 public function __construct() {
26 parent::__construct(
27 'authors',
28 /** This filter is documented in modules/widgets/facebook-likebox.php */
29 apply_filters( 'jetpack_widget_name', __( 'Authors', 'jetpack' ) ),
30 array(
31 'classname' => 'widget_authors',
32 'description' => __( 'Display blogs authors with avatars and recent posts.', 'jetpack' ),
33 'customize_selective_refresh' => true,
34 )
35 );
36
37 if ( is_active_widget( false, false, $this->id_base ) || is_active_widget( false, false, 'monster' ) || is_customize_preview() ) {
38 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_style' ) );
39 }
40
41 add_action( 'publish_post', array( __CLASS__, 'flush_cache' ) );
42 add_action( 'deleted_post', array( __CLASS__, 'flush_cache' ) );
43 add_action( 'switch_theme', array( __CLASS__, 'flush_cache' ) );
44 }
45
46 /**
47 * Enqueue stylesheet to adapt the widget to various themes.
48 *
49 * @since 4.5.0
50 */
51 public function enqueue_style() {
52 wp_register_style( 'jetpack-authors-widget', plugins_url( 'authors/style.css', __FILE__ ), array(), '20161228' );
53 wp_enqueue_style( 'jetpack-authors-widget' );
54 }
55
56 /**
57 * Flush Authors widget cached data.
58 */
59 public static function flush_cache() {
60 wp_cache_delete( 'widget_authors', 'widget' );
61 wp_cache_delete( 'widget_authors_ssl', 'widget' );
62 }
63
64 /**
65 * Echoes the widget content.
66 *
67 * @param array $args Display arguments.
68 * @param array $instance Widget settings for the instance.
69 */
70 public function widget( $args, $instance ) {
71 $cache_bucket = is_ssl() ? 'widget_authors_ssl' : 'widget_authors';
72
73 if ( '%BEG_OF_TITLE%' !== $args['before_title'] ) {
74 $output = wp_cache_get( $cache_bucket, 'widget' );
75 if ( $output ) {
76 echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Cached widget display.
77 return;
78 }
79
80 ob_start();
81 }
82
83 $instance = wp_parse_args(
84 $instance,
85 array(
86 'title' => __( 'Authors', 'jetpack' ),
87 'all' => false,
88 'number' => 5,
89 'avatar_size' => 48,
90 )
91 );
92 $instance['number'] = min( 10, max( 0, (int) $instance['number'] ) );
93
94 // We need to query at least one post to determine whether an author has written any posts or not.
95 $query_number = max( $instance['number'], 1 );
96
97 /**
98 * Filter authors from the Widget Authors widget.
99 *
100 * @module widgets
101 *
102 * @deprecated 7.7.0 Use jetpack_widget_authors_params instead.
103 *
104 * @since 4.5.0
105 *
106 * @param array $default_excluded_authors Array of user ID's that will be excluded
107 */
108 $excluded_authors = apply_filters( 'jetpack_widget_authors_exclude', array() );
109
110 /**
111 * Filter the parameters of `get_users` call in the Widget Authors widget.
112 *
113 * See the following for `get_users` default arguments:
114 * https://codex.wordpress.org/Function_Reference/get_users
115 *
116 * @module widgets
117 *
118 * @since 7.7.0
119 *
120 * @param array $get_author_params Array of params used in `get_user`
121 */
122 $get_author_params = apply_filters(
123 'jetpack_widget_authors_params',
124 array(
125 'capability' => array( 'edit_posts' ),
126 'exclude' => (array) $excluded_authors,
127 )
128 );
129
130 $authors = get_users( $get_author_params );
131
132 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
133 /** This filter is documented in core/src/wp-includes/default-widgets.php */
134 $title = apply_filters( 'widget_title', $instance['title'] );
135 echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
136 echo '<ul>';
137
138 $default_post_type = 'post';
139 /**
140 * Filter types of posts that will be counted in the widget
141 *
142 * @module widgets
143 *
144 * @since 4.5.0
145 *
146 * @param string|array $default_post_type type(s) of posts to count for the widget.
147 */
148 $post_types = apply_filters( 'jetpack_widget_authors_post_types', $default_post_type );
149
150 foreach ( $authors as $author ) {
151 $r = new WP_Query(
152 array(
153 'author' => $author->ID,
154 'posts_per_page' => $query_number,
155 'post_type' => $post_types,
156 'post_status' => 'publish',
157 'no_found_rows' => true,
158 'has_password' => false,
159 )
160 );
161
162 if ( ! $r->have_posts() && ! $instance['all'] ) {
163 continue;
164 }
165
166 echo '<li>';
167
168 // Display avatar and author name.
169 if ( $r->have_posts() ) {
170 echo '<a href="' . esc_url( get_author_posts_url( $author->ID ) ) . '">';
171
172 if ( $instance['avatar_size'] > 1 ) {
173 echo ' ' . get_avatar( $author->ID, $instance['avatar_size'], '', true ) . ' ';
174 }
175
176 echo '<strong>' . esc_html( $author->display_name ) . '</strong>';
177 echo '</a>';
178 } elseif ( $instance['all'] ) {
179 if ( $instance['avatar_size'] > 1 ) {
180 echo get_avatar( $author->ID, $instance['avatar_size'], '', true ) . ' ';
181 }
182
183 echo '<strong>' . esc_html( $author->display_name ) . '</strong>';
184 }
185
186 if ( 0 === (int) $instance['number'] ) {
187 echo '</li>';
188 continue;
189 }
190
191 // Display a short list of recent posts for this author.
192 if ( $r->have_posts() ) {
193 echo '<ul>';
194
195 while ( $r->have_posts() ) {
196 $r->the_post();
197
198 printf(
199 '<li><a href="%1$s" title="%2$s"%3$s>%4$s</a></li>',
200 esc_url( get_permalink() ),
201 esc_attr( wp_kses( get_the_title(), array() ) ),
202 ( get_queried_object_id() === get_the_ID() ? ' aria-current="page"' : '' ),
203 esc_html( wp_kses( get_the_title(), array() ) )
204 );
205 }
206
207 echo '</ul>';
208 }
209
210 echo '</li>';
211 }
212
213 echo '</ul>';
214 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
215
216 wp_reset_postdata();
217
218 if ( '%BEG_OF_TITLE%' !== $args['before_title'] ) {
219 wp_cache_add( $cache_bucket, ob_get_flush(), 'widget' );
220 }
221
222 /** This action is documented in modules/widgets/gravatar-profile.php */
223 do_action( 'jetpack_stats_extra', 'widget_view', 'authors' );
224 }
225
226 /**
227 * Outputs the widget settings form.
228 *
229 * @param array $instance Current settings.
230 */
231 public function form( $instance ) {
232 $instance = wp_parse_args(
233 $instance,
234 array(
235 'title' => '',
236 'all' => false,
237 'avatar_size' => 48,
238 'number' => 5,
239 )
240 );
241
242 ?>
243 <p>
244 <label>
245 <?php esc_html_e( 'Title:', 'jetpack' ); ?>
246 <input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
247 </label>
248 </p>
249 <p>
250 <label>
251 <input class="checkbox" type="checkbox" <?php checked( $instance['all'] ); ?> name="<?php echo esc_attr( $this->get_field_name( 'all' ) ); ?>" />
252 <?php esc_html_e( 'Display all authors (including those who have not written any posts)', 'jetpack' ); ?>
253 </label>
254 </p>
255 <p>
256 <label>
257 <?php esc_html_e( 'Number of posts to show for each author:', 'jetpack' ); ?>
258 <input style="width: 50px; text-align: center;" name="<?php echo esc_attr( $this->get_field_name( 'number' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['number'] ); ?>" />
259 <?php esc_html_e( '(at most 10)', 'jetpack' ); ?>
260 </label>
261 </p>
262 <p>
263 <label>
264 <?php esc_html_e( 'Avatar Size (px):', 'jetpack' ); ?>
265 <select name="<?php echo esc_attr( $this->get_field_name( 'avatar_size' ) ); ?>">
266 <?php
267 foreach ( array(
268 '1' => __( 'No Avatars', 'jetpack' ),
269 '16' => '16x16',
270 '32' => '32x32',
271 '48' => '48x48',
272 '96' => '96x96',
273 '128' => '128x128',
274 ) as $value => $label ) {
275 ?>
276 <option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, $instance['avatar_size'] ); ?>><?php echo esc_html( $label ); ?></option>
277 <?php } ?>
278 </select>
279 </label>
280 </p>
281 <?php
282 }
283
284 /**
285 * Updates the widget on save and flushes cache.
286 *
287 * @param array $new_instance New widget instance data.
288 * @param array $old_instance Old widget instance data.
289 * @return array
290 */
291 public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
292 $new_instance['title'] = wp_strip_all_tags( $new_instance['title'] );
293 $new_instance['all'] = isset( $new_instance['all'] );
294 $new_instance['number'] = (int) $new_instance['number'];
295 $new_instance['avatar_size'] = (int) $new_instance['avatar_size'];
296
297 self::flush_cache();
298
299 return $new_instance;
300 }
301 }
302
303 add_action( 'widgets_init', 'jetpack_register_widget_authors' );
304 /**
305 * Register the Authors widget.
306 */
307 function jetpack_register_widget_authors() {
308 register_widget( 'Jetpack_Widget_Authors' );
309 }
310