PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.1.2
Jetpack – WP Security, Backup, Speed, & Growth v15.1.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 1 year ago contact-info 1 year ago eu-cookie-law 1 year ago facebook-likebox 11 years ago flickr 1 year ago gallery 1 year ago goodreads 1 year ago google-translate 1 year ago image-widget 1 year ago instagram 1 year ago internet-defense-league 2 years ago milestone 1 year ago my-community 1 year ago social-icons 1 year ago social-media-icons 1 year ago top-posts 1 year ago wordpress-post-widget 11 months ago authors.php 1 year ago blog-stats.php 1 year ago class-jetpack-eu-cookie-law-widget.php 10 months ago class-jetpack-instagram-widget.php 1 year ago contact-info.php 1 year ago customizer-controls.css 1 year ago customizer-utils.js 1 year ago facebook-likebox.php 1 year ago flickr.php 1 year ago gallery.php 1 year ago goodreads.php 11 months ago google-translate.php 1 year ago gravatar-profile.css 1 year ago gravatar-profile.php 1 year ago image-widget.php 1 year ago internet-defense-league.php 1 year ago mailchimp.php 1 year ago milestone.php 1 year ago my-community.php 1 year ago rsslinks-widget.php 1 year ago simple-payments.php 1 year ago social-icons.php 1 year ago social-media-icons.php 1 year ago top-posts.php 1 year ago twitter-timeline-admin.js 1 year ago twitter-timeline.php 1 year ago upcoming-events.php 1 year ago wordpress-post-widget.php 1 year 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( 0 );
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 add_action( 'publish_post', array( __CLASS__, 'flush_cache' ) );
38 add_action( 'deleted_post', array( __CLASS__, 'flush_cache' ) );
39 add_action( 'switch_theme', array( __CLASS__, 'flush_cache' ) );
40 }
41
42 /**
43 * Enqueue stylesheet to adapt the widget to various themes.
44 *
45 * @since 4.5.0
46 */
47 public function enqueue_style() {
48 wp_register_style( 'jetpack-authors-widget', plugins_url( 'authors/style.css', __FILE__ ), array(), '20161228' );
49 wp_enqueue_style( 'jetpack-authors-widget' );
50 }
51
52 /**
53 * Flush Authors widget cached data.
54 */
55 public static function flush_cache() {
56 wp_cache_delete( 'widget_authors', 'widget' );
57 wp_cache_delete( 'widget_authors_ssl', 'widget' );
58 }
59
60 /**
61 * Echoes the widget content.
62 *
63 * @param array $args Display arguments.
64 * @param array $instance Widget settings for the instance.
65 */
66 public function widget( $args, $instance ) {
67 // Enqueue front end assets.
68 $this->enqueue_style();
69
70 $cache_bucket = is_ssl() ? 'widget_authors_ssl' : 'widget_authors';
71
72 if ( '%BEG_OF_TITLE%' !== $args['before_title'] ) {
73 $output = wp_cache_get( $cache_bucket, 'widget' );
74 if ( $output ) {
75 echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Cached widget display.
76 return;
77 }
78
79 ob_start();
80 }
81
82 $instance = wp_parse_args(
83 $instance,
84 array(
85 'title' => __( 'Authors', 'jetpack' ),
86 'all' => false,
87 'number' => 5,
88 'avatar_size' => 48,
89 )
90 );
91 $instance['number'] = min( 10, max( 0, (int) $instance['number'] ) );
92
93 // We need to query at least one post to determine whether an author has written any posts or not.
94 $query_number = max( $instance['number'], 1 );
95
96 /**
97 * Filter authors from the Widget Authors widget.
98 *
99 * @module widgets
100 *
101 * @deprecated 7.7.0 Use jetpack_widget_authors_params instead.
102 *
103 * @since 4.5.0
104 *
105 * @param array $default_excluded_authors Array of user ID's that will be excluded
106 */
107 $excluded_authors = apply_filters( 'jetpack_widget_authors_exclude', array() );
108
109 /**
110 * Filter the parameters of `get_users` call in the Widget Authors widget.
111 *
112 * See the following for `get_users` default arguments:
113 * https://codex.wordpress.org/Function_Reference/get_users
114 *
115 * @module widgets
116 *
117 * @since 7.7.0
118 *
119 * @param array $get_author_params Array of params used in `get_user`
120 */
121 $get_author_params = apply_filters(
122 'jetpack_widget_authors_params',
123 array(
124 'capability' => array( 'edit_posts' ),
125 'exclude' => (array) $excluded_authors,
126 )
127 );
128
129 $authors = get_users( $get_author_params );
130
131 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
132 /** This filter is documented in core/src/wp-includes/default-widgets.php */
133 $title = apply_filters( 'widget_title', $instance['title'] );
134 echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
135 echo '<ul>';
136
137 $default_post_type = 'post';
138 /**
139 * Filter types of posts that will be counted in the widget
140 *
141 * @module widgets
142 *
143 * @since 4.5.0
144 *
145 * @param string|array $default_post_type type(s) of posts to count for the widget.
146 */
147 $post_types = apply_filters( 'jetpack_widget_authors_post_types', $default_post_type );
148
149 foreach ( $authors as $author ) {
150 $r = new WP_Query(
151 array(
152 'author' => $author->ID,
153 'posts_per_page' => $query_number,
154 'post_type' => $post_types,
155 'post_status' => 'publish',
156 'no_found_rows' => true,
157 'has_password' => false,
158 )
159 );
160
161 if ( ! $r->have_posts() && ! $instance['all'] ) {
162 continue;
163 }
164
165 echo '<li>';
166
167 // Display avatar and author name.
168 if ( $r->have_posts() ) {
169 echo '<a href="' . esc_url( get_author_posts_url( $author->ID ) ) . '">';
170
171 if ( $instance['avatar_size'] > 1 ) {
172 echo ' ' . get_avatar( $author->ID, $instance['avatar_size'], '', true ) . ' ';
173 }
174
175 echo '<strong>' . esc_html( $author->display_name ) . '</strong>';
176 echo '</a>';
177 } elseif ( $instance['all'] ) {
178 if ( $instance['avatar_size'] > 1 ) {
179 echo get_avatar( $author->ID, $instance['avatar_size'], '', true ) . ' ';
180 }
181
182 echo '<strong>' . esc_html( $author->display_name ) . '</strong>';
183 }
184
185 if ( 0 === (int) $instance['number'] ) {
186 echo '</li>';
187 continue;
188 }
189
190 // Display a short list of recent posts for this author.
191 if ( $r->have_posts() ) {
192 echo '<ul>';
193
194 while ( $r->have_posts() ) {
195 $r->the_post();
196
197 printf(
198 '<li><a href="%1$s" title="%2$s"%3$s>%4$s</a></li>',
199 esc_url( get_permalink() ),
200 esc_attr( wp_kses( get_the_title(), array() ) ),
201 ( get_queried_object_id() === get_the_ID() ? ' aria-current="page"' : '' ),
202 esc_html( wp_kses( get_the_title(), array() ) )
203 );
204 }
205
206 echo '</ul>';
207 }
208
209 echo '</li>';
210 }
211
212 echo '</ul>';
213 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
214
215 wp_reset_postdata();
216
217 if ( '%BEG_OF_TITLE%' !== $args['before_title'] ) {
218 wp_cache_add( $cache_bucket, ob_get_flush(), 'widget' );
219 }
220
221 /** This action is documented in modules/widgets/gravatar-profile.php */
222 do_action( 'jetpack_stats_extra', 'widget_view', 'authors' );
223 }
224
225 /**
226 * Outputs the widget settings form.
227 *
228 * @param array $instance Current settings.
229 * @return string|void
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'] ) ? (bool) $new_instance['all'] : false;
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