Code for Recent Posts Widget

I want to make changes to code of the Recent Posts widget – could anyone please tell me where that code is located?

Thank you in advance!

Related posts

Leave a Reply

2 comments

  1. Have a look in wp-includesdefault-widgets.php.

    /**
     * Recent_Posts widget class
     *
     * @since 2.8.0
     */
    class WP_Widget_Recent_Posts extends WP_Widget {
    
        function __construct() {
            $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "The most recent posts on your site") );
            parent::__construct('recent-posts', __('Recent Posts'), $widget_ops);
            $this->alt_option_name = 'widget_recent_entries';
    
            add_action( 'save_post', array($this, 'flush_widget_cache') );
            add_action( 'deleted_post', array($this, 'flush_widget_cache') );
            add_action( 'switch_theme', array($this, 'flush_widget_cache') );
        }
    
        function widget($args, $instance) {
            $cache = wp_cache_get('widget_recent_posts', 'widget');
    
            if ( !is_array($cache) )
                $cache = array();
    
            if ( ! isset( $args['widget_id'] ) )
                $args['widget_id'] = $this->id;
    
            if ( isset( $cache[ $args['widget_id'] ] ) ) {
                echo $cache[ $args['widget_id'] ];
                return;
            }
    
            ob_start();
            extract($args);
    
            $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Posts' );
            $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
            $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 10;
            if ( ! $number )
                $number = 10;
            $show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;
    
            $r = new WP_Query( apply_filters( 'widget_posts_args', array( 'posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true ) ) );
            if ($r->have_posts()) :
    ?>
            <?php echo $before_widget; ?>
            <?php if ( $title ) echo $before_title . $title . $after_title; ?>
            <ul>
            <?php while ( $r->have_posts() ) : $r->the_post(); ?>
                <li>
                    <a href="<?php the_permalink() ?>" title="<?php echo esc_attr( get_the_title() ? get_the_title() : get_the_ID() ); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a>
                <?php if ( $show_date ) : ?>
                    <span class="post-date"><?php echo get_the_date(); ?></span>
                <?php endif; ?>
                </li>
            <?php endwhile; ?>
            </ul>
            <?php echo $after_widget; ?>
    <?php
            // Reset the global $the_post as this query will have stomped on it
            wp_reset_postdata();
    
            endif;
    
            $cache[$args['widget_id']] = ob_get_flush();
            wp_cache_set('widget_recent_posts', $cache, 'widget');
        }
    
        function update( $new_instance, $old_instance ) {
            $instance = $old_instance;
            $instance['title'] = strip_tags($new_instance['title']);
            $instance['number'] = (int) $new_instance['number'];
            $instance['show_date'] = (bool) $new_instance['show_date'];
            $this->flush_widget_cache();
    
            $alloptions = wp_cache_get( 'alloptions', 'options' );
            if ( isset($alloptions['widget_recent_entries']) )
                delete_option('widget_recent_entries');
    
            return $instance;
        }
    
        function flush_widget_cache() {
            wp_cache_delete('widget_recent_posts', 'widget');
        }
    
        function form( $instance ) {
            $title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
            $number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
            $show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : false;
    ?>
            <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
            <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>
    
            <p><label for="<?php echo $this->get_field_id( 'number' ); ?>"><?php _e( 'Number of posts to show:' ); ?></label>
            <input id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>
    
            <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' ); ?>" />
            <label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Display post date?' ); ?></label></p>
    <?php
        }
    }
    

    If you modify this Widget, be sure to fork it, and register your forked Widget as a new Widget.

    Edit

    How to fork a core Widget

    Start with the Codex entry on the Widgets API.

    1. Rename the Widget

      Change this:

      class WP_Widget_Recent_Posts extends WP_Widget {}
      

      …to this:

      class wpse97411_Widget_Recent_Posts extends WP_Widget {}
      
    2. Modify the Widget class to suit your needs

    3. Register your Widget:

      function wpse97413_register_custom_widgets() {
          register_widget( 'wpse97411_Widget_Recent_Posts' );
      }
      add_action( 'widgets_init', 'wpse97413_register_custom_widgets' );