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 / authors.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
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