Base for WP_Widget

Base for creating WP Widgets.

<?php
add_action( 'widgets_init', 'PREFIX_register_widgets' );
function PREFIX_register_widgets(){
  register_widget( 'WP_Widget_FOOBAR' );
}
class WP_Widget_FOOBAR extends WP_Widget {

	/**
	 * Register widget with WordPress.
	 */
	function __construct() {

		$widget_args = array( 'classname' => 'widget_FOOBAR', 'description' => __( "Widget description", PREFIX_TEXTDOMAIN ) );

		parent::__construct( 'WIDGET-ID', __( 'Widget title', PREFIX_TEXTDOMAIN ), $widget_args );
	}
	/**
	 * Front-end display of widget.
	 *
	 * @param array $args     Widget arguments.
	 * @param array $instance Saved values from database.
	 */
	function widget( $args, $instance ) {

		extract( $args );
		$title = !empty( $instance['title'] ) ? apply_filters( 'widget_title', $instance['title'] ) : false;

		echo $before_widget;
		if ( $title ) echo $before_title . $title . $after_title;

		// do widget stuff here

		echo $after_widget;
	}
	/**
	 * Back-end widget form.
	 *
	 * @param array $instance Previously saved values from database.
	 */
	function form( $instance ) {
?>
		<p>
			<label for="<?php echo $this->get_field_id('title'); ?>">
				<?php _e('Title:'); ?> <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($instance['title']); ?>" />
			</label>
		</p>
<?php
	}
	/**
	 * Sanitize widget form values as they are saved.
	 *
	 * @param array $new_instance Values just sent to be saved.
	 * @param array $old_instance Previously saved values from database.
	 */
	function update( $new_instance, $old_instance ) {
		
		$sanitized = array();
		foreach ( $new_instance as $key => $val ) {
			$sanitized[$key] = sanitize_text_field( $new_instance[$key] );
		}
		return $sanitized;
	}

}