patric-boehner
9/21/2017 - 1:28 AM

Recent Post Excerpt Widget

Recent Post Excerpt Widget

<?php

/**
 * Recent post excerpt widget
 *
 * @package    CoreFunctionality
 * @author     Patrick Boehner <patrick@patrickboehner.com>
 * @since      1.0.1
 * @copyright  Copyright (c) 2016, Patrick Boehner
 * @license    http://opensource.org/licenses/gpl-2.0.php GNU Public License
 *
 */


//* Block Acess
//**********************
if( !defined( 'ABSPATH' ) ) exit;


//* Widget
//**********************

class PB_Recent_Post_Widget extends WP_Widget {

	/**
	 * Holds widget settings defaults, populated in constructor.
	 *
	 * @since 1.0.0
	 * @var array
	 */
	protected $defaults;

	/**
	 * Constructor
	 *
	 * @since 1.0.0
	 */
	function __construct() {

		// widget defaults
		$this->defaults = array(
			'title'          => '',
			'post_category'  => '',
		);

		// Widget Slug
		$widget_slug = 'pb-recent-post-excerpt-widget';

		// widget basics
		$widget_ops = array(
			'classname'   => $widget_slug,
			'description' => 'Display the most recent post from a cateogry you select'
		);

		// widget controls
		$control_ops = array(
			'id_base' => $widget_slug,
			// 'width'   => '400',
		);

		// load widget
		parent::__construct( $widget_slug, 'Recent Post Excerpt', $widget_ops, $control_ops );

	}

	/**
	 * Outputs the HTML for this widget.
	 *
	 * @since 1.0.0
	 * @param array $args An array of standard parameters for widgets in this theme
	 * @param array $instance An array of settings for this widget instance
	 */
	function widget( $args, $instance ) {

		extract( $args );

		// Merge with defaults
		$instance = wp_parse_args( (array) $instance, $this->defaults );

		echo $before_widget;

			//* Title
			if ( !empty( $instance['title'] ) ) {
				echo $before_title . apply_filters( 'widget_title', $instance['title'] ) . $after_title;
			}

			//* Post Query Args
			$post_args = array(
				'post_type'			=> 'post',
				'posts_per_page'	=> '1',
				'cat'	=> $instance['post_category'],
			);

			//* Post Query
			$post_query = null;
			$post_query = new WP_Query( $post_args );
			if( $post_query->have_posts() ) {
				while ( $post_query->have_posts() ) :
					$post_query->the_post();

					$post_title = esc_html( get_the_title() );
					$post_link = esc_url( get_the_permalink() );
					$button_text = esc_html( 'Continue Reading' );
					$screen_reader = '<span class="screen-reader-text"> ' .$post_title. '</span>';

					echo '<article class="recent-post">';
					echo '<header class="entry-header"><h4 class="entry-title" itemprop="headline">' .$post_title. '</h4></header>';
					echo '<div class="entry-content" itemprop="text">';
					echo the_excerpt();
					echo '<a class="button" href="' .$post_link. '" itemprop="url">' .$button_text. '' .$screen_reader. '</a>';
					echo '</div></article>';

			endwhile;
			wp_reset_postdata();

		}

		echo $after_widget;

	}

	/**
	 * Deals with the settings when they are saved by the admin. Here is
	 * where any validation should be dealt with.
	 *
	 * @since 1.0.0
	 * @param array $new_instance An array of new settings as submitted by the admin
	 * @param array $old_instance An array of the previous settings
	 * @return array The validated and (if necessary) amended settings
	 */
	function update( $new_instance, $old_instance ) {

		$new_instance['title']          = strip_tags( $new_instance['title'] );
		$new_instance['post_category']  = esc_html( $new_instance['post_category'] );

		return $new_instance;
	}

	/**
	 * Displays the form for this widget on the Widgets page of the WP Admin area.
	 *
	 * @since 1.0.0
	 * @param array $instance An array of the current settings for this widget
	 */
	function form( $instance ) {

		// Merge with defaults
		$instance = wp_parse_args( (array) $instance, $this->defaults );
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>">Title:</label>
			<input type="text" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo esc_html( $instance['title'] ); ?>" class="widefat" />
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'post_category' ); ?>">Category to Display:</label>
			<?php wp_dropdown_categories( array(
				'name'				=> $this->get_field_name( 'post_category' ),
				'show_option_all' => __( 'All Categories' ),
				'hide_empty'		=> 0,
				'hierarchical'		=> 0,
				'selected'			=> $instance['post_category'],
			) ); ?>
		</p>
		<?php
	}
}
add_action( 'widgets_init', create_function( '', "register_widget('PB_Recent_Post_Widget');" ) );