308 lines
9 KiB
PHP
308 lines
9 KiB
PHP
<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
|
|
/**
|
|
* Disable direct access/execution to/of the widget code.
|
|
*/
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit( 0 );
|
|
}
|
|
|
|
// phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
|
|
|
|
/**
|
|
* Widget to display blog authors with avatars and recent posts.
|
|
*
|
|
* Configurable parameters include:
|
|
* 1. Whether to display authors who haven't written any posts
|
|
* 2. The number of posts to be displayed per author (defaults to 0)
|
|
* 3. Avatar size
|
|
*
|
|
* @since 4.5.0
|
|
*/
|
|
class Jetpack_Widget_Authors extends WP_Widget {
|
|
/**
|
|
* Jetpack_Widget_Authors contructor.
|
|
*/
|
|
public function __construct() {
|
|
parent::__construct(
|
|
'authors',
|
|
/** This filter is documented in modules/widgets/facebook-likebox.php */
|
|
apply_filters( 'jetpack_widget_name', __( 'Authors', 'jetpack' ) ),
|
|
array(
|
|
'classname' => 'widget_authors',
|
|
'description' => __( 'Display blogs authors with avatars and recent posts.', 'jetpack' ),
|
|
'customize_selective_refresh' => true,
|
|
)
|
|
);
|
|
|
|
add_action( 'publish_post', array( __CLASS__, 'flush_cache' ) );
|
|
add_action( 'deleted_post', array( __CLASS__, 'flush_cache' ) );
|
|
add_action( 'switch_theme', array( __CLASS__, 'flush_cache' ) );
|
|
}
|
|
|
|
/**
|
|
* Enqueue stylesheet to adapt the widget to various themes.
|
|
*
|
|
* @since 4.5.0
|
|
*/
|
|
public function enqueue_style() {
|
|
wp_register_style( 'jetpack-authors-widget', plugins_url( 'authors/style.css', __FILE__ ), array(), '20161228' );
|
|
wp_enqueue_style( 'jetpack-authors-widget' );
|
|
}
|
|
|
|
/**
|
|
* Flush Authors widget cached data.
|
|
*/
|
|
public static function flush_cache() {
|
|
wp_cache_delete( 'widget_authors', 'widget' );
|
|
wp_cache_delete( 'widget_authors_ssl', 'widget' );
|
|
}
|
|
|
|
/**
|
|
* Echoes the widget content.
|
|
*
|
|
* @param array $args Display arguments.
|
|
* @param array $instance Widget settings for the instance.
|
|
*/
|
|
public function widget( $args, $instance ) {
|
|
// Enqueue front end assets.
|
|
$this->enqueue_style();
|
|
|
|
$cache_bucket = is_ssl() ? 'widget_authors_ssl' : 'widget_authors';
|
|
|
|
if ( '%BEG_OF_TITLE%' !== $args['before_title'] ) {
|
|
$output = wp_cache_get( $cache_bucket, 'widget' );
|
|
if ( $output ) {
|
|
echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Cached widget display.
|
|
return;
|
|
}
|
|
|
|
ob_start();
|
|
}
|
|
|
|
$instance = wp_parse_args(
|
|
$instance,
|
|
array(
|
|
'title' => __( 'Authors', 'jetpack' ),
|
|
'all' => false,
|
|
'number' => 5,
|
|
'avatar_size' => 48,
|
|
)
|
|
);
|
|
$instance['number'] = min( 10, max( 0, (int) $instance['number'] ) );
|
|
|
|
// We need to query at least one post to determine whether an author has written any posts or not.
|
|
$query_number = max( $instance['number'], 1 );
|
|
|
|
/**
|
|
* Filter authors from the Widget Authors widget.
|
|
*
|
|
* @module widgets
|
|
*
|
|
* @deprecated 7.7.0 Use jetpack_widget_authors_params instead.
|
|
*
|
|
* @since 4.5.0
|
|
*
|
|
* @param array $default_excluded_authors Array of user ID's that will be excluded
|
|
*/
|
|
$excluded_authors = apply_filters( 'jetpack_widget_authors_exclude', array() );
|
|
|
|
/**
|
|
* Filter the parameters of `get_users` call in the Widget Authors widget.
|
|
*
|
|
* See the following for `get_users` default arguments:
|
|
* https://codex.wordpress.org/Function_Reference/get_users
|
|
*
|
|
* @module widgets
|
|
*
|
|
* @since 7.7.0
|
|
*
|
|
* @param array $get_author_params Array of params used in `get_user`
|
|
*/
|
|
$get_author_params = apply_filters(
|
|
'jetpack_widget_authors_params',
|
|
array(
|
|
'capability' => array( 'edit_posts' ),
|
|
'exclude' => (array) $excluded_authors,
|
|
)
|
|
);
|
|
|
|
$authors = get_users( $get_author_params );
|
|
|
|
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
/** This filter is documented in core/src/wp-includes/default-widgets.php */
|
|
$title = apply_filters( 'widget_title', $instance['title'] );
|
|
echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
echo '<ul>';
|
|
|
|
$default_post_type = 'post';
|
|
/**
|
|
* Filter types of posts that will be counted in the widget
|
|
*
|
|
* @module widgets
|
|
*
|
|
* @since 4.5.0
|
|
*
|
|
* @param string|array $default_post_type type(s) of posts to count for the widget.
|
|
*/
|
|
$post_types = apply_filters( 'jetpack_widget_authors_post_types', $default_post_type );
|
|
|
|
foreach ( $authors as $author ) {
|
|
$r = new WP_Query(
|
|
array(
|
|
'author' => $author->ID,
|
|
'posts_per_page' => $query_number,
|
|
'post_type' => $post_types,
|
|
'post_status' => 'publish',
|
|
'no_found_rows' => true,
|
|
'has_password' => false,
|
|
)
|
|
);
|
|
|
|
if ( ! $r->have_posts() && ! $instance['all'] ) {
|
|
continue;
|
|
}
|
|
|
|
echo '<li>';
|
|
|
|
// Display avatar and author name.
|
|
if ( $r->have_posts() ) {
|
|
echo '<a href="' . esc_url( get_author_posts_url( $author->ID ) ) . '">';
|
|
|
|
if ( $instance['avatar_size'] > 1 ) {
|
|
echo ' ' . get_avatar( $author->ID, $instance['avatar_size'], '', true ) . ' ';
|
|
}
|
|
|
|
echo '<strong>' . esc_html( $author->display_name ) . '</strong>';
|
|
echo '</a>';
|
|
} elseif ( $instance['all'] ) {
|
|
if ( $instance['avatar_size'] > 1 ) {
|
|
echo get_avatar( $author->ID, $instance['avatar_size'], '', true ) . ' ';
|
|
}
|
|
|
|
echo '<strong>' . esc_html( $author->display_name ) . '</strong>';
|
|
}
|
|
|
|
if ( 0 === (int) $instance['number'] ) {
|
|
echo '</li>';
|
|
continue;
|
|
}
|
|
|
|
// Display a short list of recent posts for this author.
|
|
if ( $r->have_posts() ) {
|
|
echo '<ul>';
|
|
|
|
while ( $r->have_posts() ) {
|
|
$r->the_post();
|
|
|
|
printf(
|
|
'<li><a href="%1$s" title="%2$s"%3$s>%4$s</a></li>',
|
|
esc_url( get_permalink() ),
|
|
esc_attr( wp_kses( get_the_title(), array() ) ),
|
|
( get_queried_object_id() === get_the_ID() ? ' aria-current="page"' : '' ),
|
|
esc_html( wp_kses( get_the_title(), array() ) )
|
|
);
|
|
}
|
|
|
|
echo '</ul>';
|
|
}
|
|
|
|
echo '</li>';
|
|
}
|
|
|
|
echo '</ul>';
|
|
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
|
|
wp_reset_postdata();
|
|
|
|
if ( '%BEG_OF_TITLE%' !== $args['before_title'] ) {
|
|
wp_cache_add( $cache_bucket, ob_get_flush(), 'widget' );
|
|
}
|
|
|
|
/** This action is documented in modules/widgets/gravatar-profile.php */
|
|
do_action( 'jetpack_stats_extra', 'widget_view', 'authors' );
|
|
}
|
|
|
|
/**
|
|
* Outputs the widget settings form.
|
|
*
|
|
* @param array $instance Current settings.
|
|
*/
|
|
public function form( $instance ) {
|
|
$instance = wp_parse_args(
|
|
$instance,
|
|
array(
|
|
'title' => '',
|
|
'all' => false,
|
|
'avatar_size' => 48,
|
|
'number' => 5,
|
|
)
|
|
);
|
|
|
|
?>
|
|
<p>
|
|
<label>
|
|
<?php esc_html_e( 'Title:', 'jetpack' ); ?>
|
|
<input class="widefat" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
|
|
</label>
|
|
</p>
|
|
<p>
|
|
<label>
|
|
<input class="checkbox" type="checkbox" <?php checked( $instance['all'] ); ?> name="<?php echo esc_attr( $this->get_field_name( 'all' ) ); ?>" />
|
|
<?php esc_html_e( 'Display all authors (including those who have not written any posts)', 'jetpack' ); ?>
|
|
</label>
|
|
</p>
|
|
<p>
|
|
<label>
|
|
<?php esc_html_e( 'Number of posts to show for each author:', 'jetpack' ); ?>
|
|
<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'] ); ?>" />
|
|
<?php esc_html_e( '(at most 10)', 'jetpack' ); ?>
|
|
</label>
|
|
</p>
|
|
<p>
|
|
<label>
|
|
<?php esc_html_e( 'Avatar Size (px):', 'jetpack' ); ?>
|
|
<select name="<?php echo esc_attr( $this->get_field_name( 'avatar_size' ) ); ?>">
|
|
<?php
|
|
foreach ( array(
|
|
'1' => __( 'No Avatars', 'jetpack' ),
|
|
'16' => '16x16',
|
|
'32' => '32x32',
|
|
'48' => '48x48',
|
|
'96' => '96x96',
|
|
'128' => '128x128',
|
|
) as $value => $label ) {
|
|
?>
|
|
<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $value, $instance['avatar_size'] ); ?>><?php echo esc_html( $label ); ?></option>
|
|
<?php } ?>
|
|
</select>
|
|
</label>
|
|
</p>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Updates the widget on save and flushes cache.
|
|
*
|
|
* @param array $new_instance New widget instance data.
|
|
* @param array $old_instance Old widget instance data.
|
|
* @return array
|
|
*/
|
|
public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
|
|
$new_instance['title'] = wp_strip_all_tags( $new_instance['title'] );
|
|
$new_instance['all'] = isset( $new_instance['all'] ) ? (bool) $new_instance['all'] : false;
|
|
$new_instance['number'] = (int) $new_instance['number'];
|
|
$new_instance['avatar_size'] = (int) $new_instance['avatar_size'];
|
|
|
|
self::flush_cache();
|
|
|
|
return $new_instance;
|
|
}
|
|
}
|
|
|
|
add_action( 'widgets_init', 'jetpack_register_widget_authors' );
|
|
/**
|
|
* Register the Authors widget.
|
|
*/
|
|
function jetpack_register_widget_authors() {
|
|
register_widget( 'Jetpack_Widget_Authors' );
|
|
}
|