PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 13.6
Jetpack – WP Security, Backup, Speed, & Growth v13.6
16.2-beta 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 All 501 releases
jetpack / modules / widgets / authors.php

authors.php in Jetpack – WP Security, Backup, Speed, & Growth 13.6, at modules/widgets/authors.php

310 lines 9.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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