<?php
namespace CarouselSlider\Widget;
use CarouselSlider\Frontend\Frontend;
use CarouselSlider\Helper;
use WP_Widget;
defined( 'ABSPATH' ) || exit;
/**
* CarouselSliderWidget class
*/
class CarouselSliderWidget extends WP_Widget {
/**
* The instance of the class
*
* @var self
*/
protected static $instance;
/**
* Ensures only one instance of the class is loaded or can be loaded.
*
* @return self
*/
public static function init() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
add_action( 'widgets_init', [ self::$instance, 'register' ] );
}
return self::$instance;
}
/**
* Register current class as widget
*/
public static function register() {
register_widget( __CLASS__ );
}
/**
* Get the list of carousel sliders
*
* @return array
*/
private static function carousels_list(): array {
$posts = Helper::get_sliders();
$items = [];
foreach ( $posts as $post ) {
$items[] = [
'id' => $post->ID,
'title' => $post->post_title,
];
}
return $items;
}
/**
* Sets up the widgets name etc
*/
public function __construct() {
$widget_ops = array(
'classname' => 'widget_carousel_slider',
'description' => __(
'The easiest way to create image, video, post and WooCommerce product carousel.',
'carousel-slider'
),
);
parent::__construct( 'widget_carousel_slider', __( 'Carousel Slider', 'carousel-slider' ), $widget_ops );
}
/**
* Outputs the content of the widget
*
* @param array $args Display arguments including 'before_title', 'after_title',
* 'before_widget', and 'after_widget'.
* @param array $instance The settings for the particular instance of the widget.
*/
public function widget( $args, $instance ) {
$title = isset( $instance['title'] ) ? esc_html( $instance['title'] ) : null;
$carousel_id = isset( $instance['carousel_id'] ) ? absint( $instance['carousel_id'] ) : 0;
if ( ! $carousel_id ) {
return;
}
$html = $args['before_widget'];
if ( ! empty( $title ) ) {
$html .= $args['before_title'] . $title . $args['after_title'];
}
$html .= Frontend::init()->carousel_slide( [ 'id' => $carousel_id ] );
$html .= $args['after_widget'];
Helper::print_unescaped_internal_string( $html );
}
/**
* Outputs the settings update form.
*
* @param array $instance Current settings.
*
* @return void
*/
public function form( $instance ) {
$carousels = static::carousels_list();
$carousel_id = ! empty( $instance['carousel_id'] ) ? absint( $instance['carousel_id'] ) : null;
$title = ! empty( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
$html = '';
if ( count( $carousels ) > 0 ) {
$html .= sprintf(
'<p><label for="%1$s">%2$s</label>',
$this->get_field_id( 'title' ),
__( 'Title (optional):', 'carousel-slider' )
);
$html .= sprintf(
'<input type="text" class="widefat" id="%1$s" name="%2$s" value="%3$s" /></p>',
$this->get_field_id( 'title' ),
$this->get_field_name( 'title' ),
$title
);
$html .= sprintf( '<p><label>%s</label>', __( 'Choose Slide', 'carousel-slider' ) );
$html .= sprintf( '<select class="widefat" name="%s">', $this->get_field_name( 'carousel_id' ) );
foreach ( $carousels as $carousel ) {
$selected = $carousel['id'] === $carousel_id ? 'selected="selected"' : '';
$html .= sprintf(
'<option value="%1$d" %3$s>%2$s</option>',
absint( $carousel['id'] ),
esc_html( $carousel['title'] ),
$selected
);
}
$html .= '</select></p>';
} else {
$html .= sprintf(
'<p>%1$s <a href="' . admin_url( 'post-new.php?post_type=carousels' ) . '">%3$s</a> %2$s</p>',
__( 'You did not add any carousel slider yet.', 'carousel-slider' ),
__( 'to create a new carousel slider now.', 'carousel-slider' ),
__( 'click here', 'carousel-slider' )
);
}
echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
/**
* Processing widget options on save
*
* @param array $new_instance The new options.
* @param array $old_instance The previous options.
*
* @return array
*/
public function update( $new_instance, $old_instance ) {
$old_instance['title'] = sanitize_text_field( $new_instance['title'] );
$old_instance['carousel_id'] = absint( $new_instance['carousel_id'] );
return $old_instance;
}
}