Last active
September 11, 2018 06:58
-
-
Save daniloparrajr/8c3e1fd0b7ce814e2afc7aa96ce03e8d to your computer and use it in GitHub Desktop.
Custom Wordpress Recent Post
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Widget API: WP_Widget_Better_Recent_Posts class | |
*/ | |
/** | |
* Register and load the widget. | |
* | |
* @return void | |
*/ | |
function wp_better_recent_posts() { | |
register_widget( 'WP_Widget_Better_Recent_Posts' ); | |
} | |
add_action( 'widgets_init', 'wp_better_recent_posts' ); | |
/** | |
* Add Better Recent Post Thumbnail to WordPress image sizes. | |
* | |
* @return void | |
*/ | |
function wp_better_recent_posts_thumb() { | |
add_image_size( 'better-recent-post-thumb', 60, 60, true ); | |
} | |
add_action( 'after_setup_theme', 'wp_better_recent_posts_thumb' ); | |
/** | |
* Core class used to implement a Recent Posts widget. | |
* | |
* @since 2.8.0 | |
* | |
* @see WP_Widget | |
*/ | |
class WP_Widget_Better_Recent_Posts extends WP_Widget { | |
/** | |
* Sets up a new Better Recent Posts widget instance. | |
* | |
* @since 2.8.0 | |
*/ | |
public function __construct() { | |
$widget_ops = array( | |
'classname' => 'widget_better_recent_entries', | |
'description' => __( 'Your site’s most recent Posts! BETTER! ' ), | |
'customize_selective_refresh' => true, | |
); | |
parent::__construct( 'improved-recent-posts', __( 'Better Recent Posts' ), $widget_ops ); | |
$this->alt_option_name = 'widget_better_recent_entries'; | |
} | |
/** | |
* Outputs the content for the current Improved Recent Posts widget instance. | |
* | |
* @since 2.8.0 | |
* | |
* @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'] : __( 'Improved Recent Posts' ); | |
$post_type = ( ! empty( $instance['post_type'] ) ) ? $instance['post_type'] : 'post'; | |
/** 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; | |
/** | |
* Filters the arguments for the Recent Posts widget. | |
* | |
* @since 3.4.0 | |
* @since 4.9.0 Added the `$instance` parameter. | |
* | |
* @see WP_Query::get_posts() | |
* | |
* @param array $args An array of arguments used to retrieve the recent posts. | |
* @param array $instance Array of settings for the current widget. | |
*/ | |
$recent_posts = new WP_Query( array( | |
'posts_per_page' => $number, | |
'post_status' => 'publish', | |
'post_type' => $post_type, | |
'ignore_sticky_posts' => true, | |
) ); | |
if ( ! $recent_posts->have_posts() ) { | |
return; | |
} | |
?> | |
<?php echo $args['before_widget']; ?> | |
<?php | |
if ( $title ) { | |
echo $args['before_title'] . $title . $args['after_title']; | |
} | |
?> | |
<div class="wp-brp-wrap"> | |
<?php | |
foreach ( $recent_posts->posts as $recent_post ) : | |
$recent_posts->the_post(); | |
$post_title = get_the_title(); | |
$post_content = get_the_content(); | |
$title = ( ! empty( $post_title ) ) ? $post_title : __( '(no title)' ); | |
$featured_img_url = get_the_post_thumbnail_url( get_the_ID(), 'better-recent-post-thumb' ); | |
?> | |
<article class="wp-brp"> | |
<figure class="wp-brp__image-wrap"> | |
<a href="<?php the_permalink(); ?>"> | |
<img class="wp-brp__image" src="<?php echo $featured_img_url; ?>" alt="<?php echo $post_title; ?>"> | |
</a> | |
</figure> | |
<div class="wp-brp__content"> | |
<a href="<?php the_permalink(); ?>"> | |
<h5 class="wp-brp__title"><?php echo $post_title; ?></h5> | |
</a> | |
<div class="wp-brp__post-content"> | |
<?php echo truncate_post( 100 ); ?> | |
</div> | |
<?php if ( $show_date ) : ?> | |
<p class="wp-brp__post-date u-text-primary"><strong><?php echo get_the_date( '', $recent_post->ID ); ?></strong></p> | |
<?php endif; ?> | |
</div> | |
</article> | |
<?php | |
endforeach; | |
wp_reset_postdata(); | |
?> | |
</div> | |
<?php | |
echo $args['after_widget']; | |
} | |
/** | |
* Handles updating the settings for the current Recent Posts widget instance. | |
* | |
* @since 2.8.0 | |
* | |
* @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['post_type'] = sanitize_text_field( $new_instance['post_type'] ); | |
$instance['number'] = (int) $new_instance['number']; | |
$instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false; | |
return $instance; | |
} | |
/** | |
* Outputs the settings form for the Recent Posts widget. | |
* | |
* @since 2.8.0 | |
* | |
* @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; | |
$post_type = isset( $instance['post_type'] ) ? $instance['post_type'] : 'post'; | |
?> | |
<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( 'post_type' ); ?>"><?php _e( 'Post Type:' ); ?></label> | |
<input class="widefat" id="<?php echo $this->get_field_id( 'post_type' ); ?>" name="<?php echo $this->get_field_name( 'post_type' ); ?>" type="text"value="<?php echo $post_type; ?>" /></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> | |
<?php | |
} | |
/** | |
* Truncate a string provided by the maximum limit. | |
* @param string $str | |
* @param integer $maxlen | |
* @return string | |
*/ | |
public function limit_string( $string, $limit = 100, $end = '…' ) { | |
if ( mb_strwidth( $string, 'UTF-8' ) <= $limit ) { | |
return $string; | |
} | |
return rtrim( mb_strimwidth( $string, 0, $limit, '', 'UTF-8' ) ) . $end; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment