WordPress.org

Make WordPress Core

Opened 4 years ago

Closed 4 years ago

#34892 closed feature request (wontfix)

Addition of custom date format (PHP) for Recent Posts Widget

Reported by: anthony.lim Owned by:
Milestone: Priority: normal
Severity: normal Version: 4.4
Component: Widgets Keywords:
Focuses: Cc:

Description

<?php
/**
 * Widget API: WP_Widget_Recent_Posts class
 *
 * @package WordPress
 * @subpackage Widgets
 * @since 4.4.0
 */

/**
 * Core class used to implement a Recent Posts widget.
 *
 * @since 2.8.0
 *
 * @see WP_Widget
 */
class WP_Widget_Recent_Posts extends WP_Widget {

        /**
         * Sets up a new Recent Posts widget instance.
         *
         * @since 2.8.0
         * @access public
         */
        public function __construct() {
                $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "Your site&#8217;s most recent Posts.") );
                parent::__construct('recent-posts', __('Recent Posts'), $widget_ops);
                $this->alt_option_name = 'widget_recent_entries';
        }

        /**
         * Outputs the content for the current Recent Posts widget instance.
         *
         * @since 2.8.0
         * @access public
         *
         * @param array $args     Display arguments including 'before_title', 'after_title',
         *                        'before_widget', and 'after_widget'.
         * @param array $instance Settings for the current Recent Posts widget instance.
         */
        public function widget( $args, $instance ) {
                if ( ! isset( $args['widget_id'] ) ) {
                        $args['widget_id'] = $this->id;
                }

                $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Posts' );

                /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
                $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

                $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
                if ( ! $number )
                        $number = 5;
                $show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;
                $format = ( ! empty( $instance['format'] ) ) ? $instance['format'] : null;

                /**
                 * Filter the arguments for the Recent Posts widget.
                 *
                 * @since 3.4.0
                 *
                 * @see WP_Query::get_posts()
                 *
                 * @param array $args An array of arguments used to retrieve the recent posts.
                 */
                $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 $args['before_widget']; ?>
                <?php if ( $title ) {
                        echo $args['before_title'] . $title . $args['after_title'];
                } ?>
                <ul>
                <?php while ( $r->have_posts() ) : $r->the_post(); ?>
                        <li>
                                <a href="<?php the_permalink(); ?>"><?php get_the_title() ? the_title() : the_ID(); ?></a>
                        <?php if ( $show_date ) : ?>
                                <span class="post-date"><?php echo ( $format===null ? get_the_date() : get_the_date($format) ); ?></span>
                        <?php endif; ?>
                        </li>
                <?php endwhile; ?>
                </ul>
                <?php echo $args['after_widget']; ?>
                <?php
                // Reset the global $the_post as this query will have stomped on it
                wp_reset_postdata();

                endif;
        }

        /**
         * Handles updating the settings for the current Recent Posts widget instance.
         *
         * @since 2.8.0
         * @access public
         *
         * @param array $new_instance New settings for this instance as input by the user via
         *                            WP_Widget::form().
         * @param array $old_instance Old settings for this instance.
         * @return array Updated settings to save.
         */
        public function update( $new_instance, $old_instance ) {
                $instance = $old_instance;
                $instance['title'] = sanitize_text_field( $new_instance['title'] );
                $instance['number'] = (int) $new_instance['number'];
                $instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false;
                $instance['format'] = sanitize_text_field( trim($new_instance['format']) );
                return $instance;
        }

        /**
         * Outputs the settings form for the Recent Posts widget.
         *
         * @since 2.8.0
         * @access public
         *
         * @param array $instance Current settings.
         */
        public 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;
                $format    = isset( $instance['format'] ) ? esc_attr( $instance['format'] ) : '';
?>
                <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 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>

                <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>

        <p><label for="<?php echo $this->get_field_id( 'format' ); ?>"><?php _e( 'PHP date format:' ); ?></label>
                <input class="widefat" id="<?php echo $this->get_field_id( 'format' ); ?>" name="<?php echo $this->get_field_name( 'format' ); ?>" placeholder="<?php _e('Leave blank for default'); ?>" type="text" value="<?php echo $format; ?>" /></p>
<?php
        }
}

Attachments (1)

34892.patch (2.6 KB) - added by anthony.lim 4 years ago.
Added a text field for PHP date format and use this for displaying the post date, if supplied.

Download all attachments as: .zip

Change History (8)

#1 @welcher
4 years ago

  • Keywords needs-patch added

It's much easier to review and test the changes if they are in a diff file instead of in the comment feed. If you need some pointers you can take a look at the following in the handbook - https://make.wordpress.org/core/handbook/tutorials/working-with-patches/

Also, some more description as to what you want to accomplish will help a lot in determining if this is something will move forward.

Thank you for the submission and welcome!

Last edited 4 years ago by welcher (previous) (diff)

#2 @welcher
4 years ago

  • Keywords reporter-feedback added; needs-patch removed

@anthony.lim
4 years ago

Added a text field for PHP date format and use this for displaying the post date, if supplied.

#3 @anthony.lim
4 years ago

  • Keywords has-patch added

I'm a little big new about requesting/adding new features here. I accidentally uploaded the diff patch before this comment, and unable to attach the diff patch on this comment, so please refer to the previous attachment.

The new feature is supposed to allow the user to set a PHP date format in the widget so they can customize the post date output format instead of the default.

Thanks for the welcoming reply!

#4 @swissspidy
4 years ago

  • Keywords reporter-feedback removed

Why add a new date format option to the widget when there's already one in Options -> General that is used throughout the site?

The average user has no idea of PHP date format options. What should they enter there?

Leave blank for default

The average user has no idea what the default is.

I'd say this is plugin territory.

#5 @anthony.lim
4 years ago

  • Keywords reporter-feedback close added

To plugin territory it is!

#6 @anthony.lim
4 years ago

  • Keywords has-patch reporter-feedback removed

#7 @swissspidy
4 years ago

  • Keywords close removed
  • Milestone Awaiting Review deleted
  • Resolution set to wontfix
  • Status changed from new to closed
Note: See TracTickets for help on using tickets.