* } */ class Stories extends WP_Widget { public const SCRIPT_HANDLE = 'web-stories-widget'; /** * Widget args. * * @var array */ public array $args = [ 'before_title' => '

', 'after_title' => '

', 'before_widget' => '
', 'after_widget' => '
', ]; /** * Assets instance. * * @var Assets Assets instance. */ protected Assets $assets; /** * Story_Post_Type instance. * * @var Story_Post_Type Story_Post_Type instance. */ private Story_Post_Type $story_post_type; /** * Stories_Script_Data instance. * * @var Stories_Script_Data Stories_Script_Data instance. */ protected Stories_Script_Data $stories_script_data; /** * Stories constructor. * * @since 1.5.0 * * @param Assets $assets Assets instance. * @param Story_Post_Type $story_post_type Story_Post_Type instance. * @param Stories_Script_Data $stories_script_data Stories_Script_Data instance. * @return void */ public function __construct( Assets $assets, Story_Post_Type $story_post_type, Stories_Script_Data $stories_script_data ) { $this->assets = $assets; $this->story_post_type = $story_post_type; $this->stories_script_data = $stories_script_data; $id_base = 'web_stories_widget'; $name = __( 'Web Stories', 'web-stories' ); $widget_options = [ 'description' => __( 'Display Web Stories in sidebar section.', 'web-stories' ), 'classname' => 'web-stories-widget', 'show_instance_in_rest' => true, ]; parent::__construct( $id_base, $name, $widget_options ); } /** * Output widget. * * @since 1.5.0 * * @param array $args Widget args. * @param array $instance Widget instance. */ public function widget( $args, $instance ): void { // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped echo $args['before_widget']; $instance = wp_parse_args( $instance, $this->default_values() ); $title = $instance['title']; /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); if ( ! empty( $title ) ) { echo $args['before_title'] . $title . $args['after_title']; } $instance['number_of_columns'] = (int) $instance['number_of_columns']; $instance['number_of_stories'] = (int) $instance['number_of_stories']; $instance['circle_size'] = (int) $instance['circle_size']; $story_attrs = [ 'view_type' => $instance['view_type'], 'show_title' => (bool) $instance['show_title'], 'show_excerpt' => (bool) $instance['show_excerpt'], 'show_author' => (bool) $instance['show_author'], 'show_date' => (bool) $instance['show_date'], 'show_archive_link' => (bool) $instance['show_archive_link'], 'archive_link_label' => (string) $instance['archive_link_label'], 'circle_size' => min( absint( $instance['circle_size'] ), 150 ), 'sharp_corners' => (bool) $instance['sharp_corners'], 'image_alignment' => (string) $instance['image_alignment'], 'number_of_columns' => min( absint( $instance['number_of_columns'] ), 4 ), 'class' => 'web-stories-list--widget', ]; $story_args = [ 'posts_per_page' => min( absint( $instance['number_of_stories'] ), 20 ), // phpcs:ignore WordPress.WP.PostsPerPage.posts_per_page_posts_per_page 'orderby' => $instance['orderby'], 'order' => $instance['order'], ]; $story_query = new Story_Query( $story_attrs, $story_args ); echo $story_query->render(); echo $args['after_widget']; // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped } /** * Display widget form. * * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * * @since 1.5.0 * * @param array $instance Widget instance. */ public function form( $instance ): string { $this->enqueue_scripts(); $instance = wp_parse_args( $instance, $this->default_values() ); $title = (string) $instance['title']; $view_types = $this->stories_script_data->get_layouts(); $current_view_type = (string) $instance['view_type']; $show_title = ! empty( $instance['show_title'] ); $show_author = ! empty( $instance['show_author'] ); $show_date = ! empty( $instance['show_date'] ); $show_excerpt = ! empty( $instance['show_excerpt'] ); $show_archive_link = ! empty( $instance['show_archive_link'] ); $archive_link_label = (string) $instance['archive_link_label']; $circle_size = (int) $instance['circle_size']; $sharp_corners = (int) $instance['sharp_corners']; $image_alignment = (string) $instance['image_alignment']; $number_of_columns = (int) $instance['number_of_columns']; $number_of_stories = (int) $instance['number_of_stories']; $orderby = (string) $instance['orderby']; $order = (string) $instance['order']; $has_archive = $this->story_post_type->get_has_archive(); $this->input( [ 'id' => 'title', 'name' => 'title', 'label' => __( 'Widget Title', 'web-stories' ), 'type' => 'text', 'value' => $title, 'label_before' => true, ] ); $this->dropdown( [ 'options' => $view_types, 'selected' => $current_view_type, 'name' => 'view_type', 'id' => 'view_type', 'label' => __( 'Select Layout', 'web-stories' ), 'classname' => 'widefat view_type stories-widget-field', ] ); $this->input( [ 'id' => 'number_of_stories', 'name' => 'number_of_stories', 'label' => __( 'Number of Stories', 'web-stories' ), 'type' => 'number', 'classname' => 'widefat number_of_stories stories-widget-field', 'wrapper_class' => 'number_of_stories_wrapper', 'value' => $number_of_stories, 'label_before' => true, 'attributes' => [ 'min' => 1, 'max' => 20, ], ] ); $this->dropdown( [ 'options' => [ 'post_title' => __( 'Title', 'web-stories' ), 'post_date' => __( 'Date', 'web-stories' ), ], 'selected' => $orderby, 'name' => 'orderby', 'id' => 'orderby', 'label' => __( 'Order By', 'web-stories' ), 'classname' => 'widefat orderby stories-widget-field', ] ); $this->dropdown( [ 'options' => [ 'ASC' => __( 'Ascending', 'web-stories' ), 'DESC' => __( 'Descending', 'web-stories' ), ], 'selected' => $order, 'name' => 'order', 'id' => 'order', 'label' => __( 'Order', 'web-stories' ), 'classname' => 'widefat order stories-widget-field', ] ); $this->input( [ 'id' => 'circle-size', 'name' => 'circle_size', 'label' => __( 'Circle Size', 'web-stories' ), 'type' => 'number', 'classname' => 'widefat circle_size stories-widget-field', 'wrapper_class' => 'circle_size_wrapper', 'value' => $circle_size, 'label_before' => true, 'attributes' => [ 'min' => 80, 'max' => 200, 'step' => 5, ], ] ); $this->input( [ 'id' => 'number_of_columns', 'name' => 'number_of_columns', 'label' => __( 'Number of Columns', 'web-stories' ), 'type' => 'number', 'classname' => 'widefat number_of_columns stories-widget-field', 'wrapper_class' => 'number_of_columns_wrapper', 'value' => $number_of_columns, 'label_before' => true, 'attributes' => [ 'min' => 1, 'max' => 4, ], ] ); $this->input( [ 'id' => 'show_title', 'name' => 'show_title', 'label' => __( 'Display Title', 'web-stories' ), 'type' => 'checkbox', 'classname' => 'widefat title stories-widget-field', 'wrapper_class' => 'title_wrapper', 'value' => $show_title, ] ); $this->input( [ 'id' => 'show_excerpt', 'name' => 'show_excerpt', 'label' => __( 'Display Excerpt', 'web-stories' ), 'type' => 'checkbox', 'classname' => 'widefat excerpt stories-widget-field', 'wrapper_class' => 'excerpt_wrapper', 'value' => $show_excerpt, ] ); $this->input( [ 'id' => 'show_author', 'name' => 'show_author', 'label' => __( 'Display Author', 'web-stories' ), 'type' => 'checkbox', 'classname' => 'widefat author stories-widget-field', 'wrapper_class' => 'author_wrapper', 'value' => $show_author, ] ); $this->input( [ 'id' => 'show_date', 'name' => 'show_date', 'label' => __( 'Display Date', 'web-stories' ), 'type' => 'checkbox', 'classname' => 'widefat date stories-widget-field', 'wrapper_class' => 'date_wrapper', 'value' => $show_date, ] ); $this->radio( [ 'options' => [ 'left' => __( 'Left', 'web-stories' ), 'right' => __( 'Right', 'web-stories' ), ], 'selected' => $image_alignment, 'id' => 'image_alignment', 'name' => 'image_alignment', 'label' => __( 'Image Alignment', 'web-stories' ), 'classname' => 'widefat image_alignment stories-widget-field', 'wrapper_class' => 'image_alignment_wrapper', ] ); $this->input( [ 'id' => 'sharp_corners', 'name' => 'sharp_corners', 'label' => __( 'Use Sharp Corners', 'web-stories' ), 'type' => 'checkbox', 'classname' => 'widefat sharp_corners stories-widget-field', 'wrapper_class' => 'sharp_corners_wrapper', 'value' => $sharp_corners, ] ); if ( $has_archive ) { $this->input( [ 'id' => 'show_archive_link', 'name' => 'show_archive_link', 'label' => __( 'Display Archive Link', 'web-stories' ), 'type' => 'checkbox', 'classname' => 'widefat show_archive_link stories-widget-field', 'wrapper_class' => 'archive_link_wrapper', 'value' => $show_archive_link, ] ); $this->input( [ 'id' => 'archive_link_label', 'name' => 'archive_link_label', 'label' => __( 'Archive Link Label', 'web-stories' ), 'type' => 'text', 'classname' => 'widefat archive_link_label stories-widget-field', 'wrapper_class' => 'archive_link_label_wrapper', 'value' => $archive_link_label, 'label_before' => true, ] ); } return ''; } /** * Update widget settings. * * @SuppressWarnings(PHPMD.NPathComplexity) * * @since 1.5.0 * * @param array $new_instance New instance. * @param array $old_instance Old instance. * @return array */ public function update( $new_instance, $old_instance ): array { $instance = []; $new_instance = wp_parse_args( $new_instance, $this->default_values() ); $instance['title'] = wp_strip_all_tags( $new_instance['title'] ); $instance['view_type'] = $new_instance['view_type']; $instance['show_title'] = $new_instance['show_title']; $instance['show_excerpt'] = $new_instance['show_excerpt']; $instance['show_author'] = $new_instance['show_author']; $instance['show_date'] = $new_instance['show_date']; $instance['show_archive_link'] = $new_instance['show_archive_link']; $instance['image_alignment'] = $new_instance['image_alignment']; $instance['number_of_columns'] = min( absint( $new_instance['number_of_columns'] ), 4 ); $instance['number_of_stories'] = min( absint( $new_instance['number_of_stories'] ), 20 ); $instance['circle_size'] = min( absint( $new_instance['circle_size'] ), 150 ); $instance['archive_link_label'] = $new_instance['archive_link_label']; $instance['sharp_corners'] = $new_instance['sharp_corners']; $instance['orderby'] = $new_instance['orderby']; $instance['order'] = $new_instance['order']; return $instance; } /** * Enqueue widget script. * * @since 1.5.0 */ public function enqueue_scripts(): void { if ( wp_script_is( self::SCRIPT_HANDLE ) ) { return; } $this->assets->enqueue_style_asset( self::SCRIPT_HANDLE ); $this->assets->enqueue_script_asset( self::SCRIPT_HANDLE, [ 'jquery' ] ); wp_localize_script( self::SCRIPT_HANDLE, 'webStoriesData', $this->stories_script_data->get_script_data() ); } /** * Default values of an instance. * * @since 1.5.0 * * @return array Default values. */ private function default_values(): array { return [ 'title' => esc_html__( 'Web Stories', 'web-stories' ), 'view_type' => 'circles', 'show_title' => '', 'show_excerpt' => '', 'show_author' => '', 'show_date' => '', 'show_archive_link' => '', 'image_alignment' => 'left', 'number_of_columns' => 1, 'number_of_stories' => 5, 'circle_size' => 100, 'archive_link_label' => __( 'View all stories', 'web-stories' ), 'sharp_corners' => '', 'orderby' => 'post_date', 'order' => 'DESC', ]; } /** * Display dropdown. * * @since 1.5.0 * * @param array> $args Field args. */ private function dropdown( array $args ): void { $args = wp_parse_args( $args, [ 'options' => [], 'selected' => '', 'id' => wp_generate_uuid4(), 'name' => wp_generate_uuid4(), 'label' => '', 'classname' => 'widefat', 'wrapper_class' => 'web-stories-field-wrapper', ] ); ?>

label( $args ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>

$args Field args. */ private function radio( array $args ): void { $args = wp_parse_args( $args, [ 'options' => [], 'selected' => '', 'id' => wp_generate_uuid4(), 'name' => wp_generate_uuid4(), 'label' => '', 'classname' => 'widefat', 'wrapper_class' => 'web-stories-field-wrapper', ] ); ?>
label( $args ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>

$type ) { ?>

'text', 'id' => wp_generate_uuid4(), 'name' => wp_generate_uuid4(), 'label' => '', 'value' => '', 'classname' => 'widefat', 'wrapper_class' => 'web-stories-field-wrapper', 'label_before' => false, 'attributes' => [], ] ); ?>

label( $args ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } $extra_attrs = ''; if ( ! empty( $args['attributes'] ) && \is_array( $args['attributes'] ) ) { /** * Value. * * @var string $attr_val */ foreach ( $args['attributes'] as $attr_key => $attr_val ) { $extra_attrs .= sprintf( ' %1s=%2s', $attr_key, esc_attr( $attr_val ) ); } } ?> /> label( $args ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } ?>

$args Label args. */ private function label( array $args ): string { $args = wp_parse_args( $args, [ 'id' => '', 'label' => '', ] ); ob_start(); ?>