wp/wp-includes/widgets/class-wp-widget-recent-posts.php
changeset 7 cf61fcea0001
child 9 177826044cd9
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 <?php
       
     2 /**
       
     3  * Widget API: WP_Widget_Recent_Posts class
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Widgets
       
     7  * @since 4.4.0
       
     8  */
       
     9 
       
    10 /**
       
    11  * Core class used to implement a Recent Posts widget.
       
    12  *
       
    13  * @since 2.8.0
       
    14  *
       
    15  * @see WP_Widget
       
    16  */
       
    17 class WP_Widget_Recent_Posts extends WP_Widget {
       
    18 
       
    19 	/**
       
    20 	 * Sets up a new Recent Posts widget instance.
       
    21 	 *
       
    22 	 * @since 2.8.0
       
    23 	 */
       
    24 	public function __construct() {
       
    25 		$widget_ops = array(
       
    26 			'classname' => 'widget_recent_entries',
       
    27 			'description' => __( 'Your site&#8217;s most recent Posts.' ),
       
    28 			'customize_selective_refresh' => true,
       
    29 		);
       
    30 		parent::__construct( 'recent-posts', __( 'Recent Posts' ), $widget_ops );
       
    31 		$this->alt_option_name = 'widget_recent_entries';
       
    32 	}
       
    33 
       
    34 	/**
       
    35 	 * Outputs the content for the current Recent Posts widget instance.
       
    36 	 *
       
    37 	 * @since 2.8.0
       
    38 	 *
       
    39 	 * @param array $args     Display arguments including 'before_title', 'after_title',
       
    40 	 *                        'before_widget', and 'after_widget'.
       
    41 	 * @param array $instance Settings for the current Recent Posts widget instance.
       
    42 	 */
       
    43 	public function widget( $args, $instance ) {
       
    44 		if ( ! isset( $args['widget_id'] ) ) {
       
    45 			$args['widget_id'] = $this->id;
       
    46 		}
       
    47 
       
    48 		$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Posts' );
       
    49 
       
    50 		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
       
    51 		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
       
    52 
       
    53 		$number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
       
    54 		if ( ! $number ) {
       
    55 			$number = 5;
       
    56 		}
       
    57 		$show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;
       
    58 
       
    59 		/**
       
    60 		 * Filters the arguments for the Recent Posts widget.
       
    61 		 *
       
    62 		 * @since 3.4.0
       
    63 		 * @since 4.9.0 Added the `$instance` parameter.
       
    64 		 *
       
    65 		 * @see WP_Query::get_posts()
       
    66 		 *
       
    67 		 * @param array $args     An array of arguments used to retrieve the recent posts.
       
    68 		 * @param array $instance Array of settings for the current widget.
       
    69 		 */
       
    70 		$r = new WP_Query( apply_filters( 'widget_posts_args', array(
       
    71 			'posts_per_page'      => $number,
       
    72 			'no_found_rows'       => true,
       
    73 			'post_status'         => 'publish',
       
    74 			'ignore_sticky_posts' => true,
       
    75 		), $instance ) );
       
    76 
       
    77 		if ( ! $r->have_posts() ) {
       
    78 			return;
       
    79 		}
       
    80 		?>
       
    81 		<?php echo $args['before_widget']; ?>
       
    82 		<?php
       
    83 		if ( $title ) {
       
    84 			echo $args['before_title'] . $title . $args['after_title'];
       
    85 		}
       
    86 		?>
       
    87 		<ul>
       
    88 			<?php foreach ( $r->posts as $recent_post ) : ?>
       
    89 				<?php
       
    90 				$post_title = get_the_title( $recent_post->ID );
       
    91 				$title      = ( ! empty( $post_title ) ) ? $post_title : __( '(no title)' );
       
    92 				?>
       
    93 				<li>
       
    94 					<a href="<?php the_permalink( $recent_post->ID ); ?>"><?php echo $title ; ?></a>
       
    95 					<?php if ( $show_date ) : ?>
       
    96 						<span class="post-date"><?php echo get_the_date( '', $recent_post->ID ); ?></span>
       
    97 					<?php endif; ?>
       
    98 				</li>
       
    99 			<?php endforeach; ?>
       
   100 		</ul>
       
   101 		<?php
       
   102 		echo $args['after_widget'];
       
   103 	}
       
   104 
       
   105 	/**
       
   106 	 * Handles updating the settings for the current Recent Posts widget instance.
       
   107 	 *
       
   108 	 * @since 2.8.0
       
   109 	 *
       
   110 	 * @param array $new_instance New settings for this instance as input by the user via
       
   111 	 *                            WP_Widget::form().
       
   112 	 * @param array $old_instance Old settings for this instance.
       
   113 	 * @return array Updated settings to save.
       
   114 	 */
       
   115 	public function update( $new_instance, $old_instance ) {
       
   116 		$instance = $old_instance;
       
   117 		$instance['title'] = sanitize_text_field( $new_instance['title'] );
       
   118 		$instance['number'] = (int) $new_instance['number'];
       
   119 		$instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false;
       
   120 		return $instance;
       
   121 	}
       
   122 
       
   123 	/**
       
   124 	 * Outputs the settings form for the Recent Posts widget.
       
   125 	 *
       
   126 	 * @since 2.8.0
       
   127 	 *
       
   128 	 * @param array $instance Current settings.
       
   129 	 */
       
   130 	public function form( $instance ) {
       
   131 		$title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
       
   132 		$number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
       
   133 		$show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : false;
       
   134 ?>
       
   135 		<p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
       
   136 		<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /></p>
       
   137 
       
   138 		<p><label for="<?php echo $this->get_field_id( 'number' ); ?>"><?php _e( 'Number of posts to show:' ); ?></label>
       
   139 		<input class="tiny-text" id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="number" step="1" min="1" value="<?php echo $number; ?>" size="3" /></p>
       
   140 
       
   141 		<p><input class="checkbox" type="checkbox"<?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" />
       
   142 		<label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Display post date?' ); ?></label></p>
       
   143 <?php
       
   144 	}
       
   145 }