Last active
October 26, 2016 14:36
-
-
Save gareth-gillman/2f695cbf5a081b6f501e290bc44a5346 to your computer and use it in GitHub Desktop.
Custom Post Type WordPress Recent Posts Widget
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 | |
class WP_Widget_NANE_Recent_Posts extends WP_Widget { | |
public function __construct() { | |
$widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "Your site’s most recent Posts.", "textdomain") ); | |
parent::__construct('recent-posts', __('Recent Posts', 'textdomain'), $widget_ops, 'textdomain'); | |
$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') ); | |
} | |
/** | |
* @param array $args | |
* @param array $instance | |
*/ | |
public function widget( $args, $instance ) { | |
$cache = array(); | |
if ( ! $this->is_preview() ) { | |
$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(); | |
$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Posts' ); | |
/** This filter is documented in wp-includes/default-widgets.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; | |
/** | |
* 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, | |
'post_type' => 'post-type-name', | |
) ) ); | |
if ($r->have_posts()) : | |
?> | |
<?php echo $args['before_widget']; ?> | |
<?php if ( $title ) { | |
echo $args['before_title'] . $title . $args['after_title']; | |
} ?> | |
<?php while ( $r->have_posts() ) : $r->the_post(); ?> | |
<div class="single-wid-post"> | |
<a href="<?php the_permalink(); ?>"> | |
<?php if(has_post_thumbnail()) { | |
the_post_thumbnail( 'recentposts-thumb', array( 'class' => 'alignleft' )); | |
} | |
?> | |
<h2><?php get_the_title() ? the_title() : the_ID(); ?></h2> | |
<?php if ( $show_date ) : ?> | |
<p><i class="fa fa-clock-o"></i> <?php echo get_the_date(); ?></p> | |
<?php endif; ?> | |
</a> | |
</div> | |
<?php endwhile; ?> | |
<?php echo $args['after_widget']; ?> | |
<?php | |
// Reset the global $the_post as this query will have stomped on it | |
wp_reset_postdata(); | |
endif; | |
if ( ! $this->is_preview() ) { | |
$cache[ $args['widget_id'] ] = ob_get_flush(); | |
wp_cache_set( 'widget_recent_posts', $cache, 'widget' ); | |
} else { | |
ob_end_flush(); | |
} | |
} | |
/** | |
* @param array $new_instance | |
* @param array $old_instance | |
* @return array | |
*/ | |
public 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'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false; | |
$this->flush_widget_cache(); | |
$alloptions = wp_cache_get( 'alloptions', 'options' ); | |
if ( isset($alloptions['widget_recent_entries']) ) | |
delete_option('widget_recent_entries'); | |
return $instance; | |
} | |
/** | |
* @access public | |
*/ | |
public function flush_widget_cache() { | |
wp_cache_delete('widget_recent_posts', 'widget'); | |
} | |
/** | |
* @param array $instance | |
*/ | |
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; | |
?> | |
<p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'textdomain' ); ?></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:', 'textdomain' ); ?></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?', 'textdomain' ); ?></label></p> | |
<?php | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment