summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/modules/widgets/authors.php')
-rw-r--r--plugins/jetpack/modules/widgets/authors.php271
1 files changed, 271 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/widgets/authors.php b/plugins/jetpack/modules/widgets/authors.php
new file mode 100644
index 00000000..dfc78652
--- /dev/null
+++ b/plugins/jetpack/modules/widgets/authors.php
@@ -0,0 +1,271 @@
+<?php
+/**
+ * Disable direct access/execution to/of the widget code.
+ */
+if ( ! defined( 'ABSPATH' ) ) {
+ exit;
+}
+
+/**
+ * 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 {
+ 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,
+ )
+ );
+
+ if ( is_active_widget( false, false, $this->id_base ) || is_active_widget( false, false, 'monster' ) || is_customize_preview() ) {
+ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_style' ) );
+ }
+
+ 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
+ */
+ function enqueue_style() {
+ wp_register_style( 'jetpack-authors-widget', plugins_url( 'authors/style.css', __FILE__ ), array(), '20161228' );
+ wp_enqueue_style( 'jetpack-authors-widget' );
+ }
+
+ public static function flush_cache() {
+ wp_cache_delete( 'widget_authors', 'widget' );
+ wp_cache_delete( 'widget_authors_ssl', 'widget' );
+ }
+
+ public function widget( $args, $instance ) {
+ $cache_bucket = is_ssl() ? 'widget_authors_ssl' : 'widget_authors';
+
+ if ( '%BEG_OF_TITLE%' != $args['before_title'] ) {
+ if ( $output = wp_cache_get( $cache_bucket, 'widget' ) ) {
+ echo $output;
+ 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 );
+
+ $default_excluded_authors = array();
+ /**
+ * Filter authors from the Widget Authors widget.
+ *
+ * @module widgets
+ *
+ * @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', $default_excluded_authors );
+
+ $authors = get_users(
+ array(
+ 'fields' => 'all',
+ 'who' => 'authors',
+ 'exclude' => (array) $excluded_authors,
+ )
+ );
+
+ echo $args['before_widget'];
+ /** This filter is documented in core/src/wp-includes/default-widgets.php */
+ $title = apply_filters( 'widget_title', $instance['title'] );
+ echo $args['before_title'] . esc_html( $title ) . $args['after_title'];
+ 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="' . 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 == $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();
+ echo '<li><a href="' . get_permalink() . '">';
+
+ if ( get_the_title() ) {
+ echo get_the_title();
+ } else {
+ echo get_the_ID();
+ }
+
+ echo '</a></li>';
+ }
+
+ echo '</ul>';
+ }
+
+ echo '</li>';
+ }
+
+ echo '</ul>';
+ echo $args['after_widget'];
+
+ 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' );
+ }
+
+ public function form( $instance ) {
+ $instance = wp_parse_args(
+ $instance, array(
+ 'title' => '',
+ 'all' => false,
+ 'avatar_size' => 48,
+ 'number' => 5,
+ )
+ );
+
+ ?>
+ <p>
+ <label>
+ <?php _e( 'Title:', 'jetpack' ); ?>
+ <input class="widefat" name="<?php echo $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 $this->get_field_name( 'all' ); ?>" />
+ <?php _e( 'Display all authors (including those who have not written any posts)', 'jetpack' ); ?>
+ </label>
+ </p>
+ <p>
+ <label>
+ <?php _e( 'Number of posts to show for each author:', 'jetpack' ); ?>
+ <input style="width: 50px; text-align: center;" name="<?php echo $this->get_field_name( 'number' ); ?>" type="text" value="<?php echo esc_attr( $instance['number'] ); ?>" />
+ <?php _e( '(at most 10)', 'jetpack' ); ?>
+ </label>
+ </p>
+ <p>
+ <label>
+ <?php _e( 'Avatar Size (px):', 'jetpack' ); ?>
+ <select name="<?php echo $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
+ * @param array $old_instance
+ * @return array
+ */
+ public function update( $new_instance, $old_instance ) {
+ $new_instance['title'] = strip_tags( $new_instance['title'] );
+ $new_instance['all'] = isset( $new_instance['all'] );
+ $new_instance['number'] = (int) $new_instance['number'];
+ $new_instance['avatar_size'] = (int) $new_instance['avatar_size'];
+
+ Jetpack_Widget_Authors::flush_cache();
+
+ return $new_instance;
+ }
+}
+
+add_action( 'widgets_init', 'jetpack_register_widget_authors' );
+function jetpack_register_widget_authors() {
+ register_widget( 'Jetpack_Widget_Authors' );
+};