HEX
Server: nginx/1.24.0
System: Linux DGT-WORDPRESS-VM-SERVER 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 8.4.12
Disabled: NONE
Upload Files
File: /mnt/data/dreamsai-wp/wp-content/dreams-ai/includes/recent-posts-widgets.php
<?php
/**
 * Widget: Dreamsai Recent Posts
 */

if (!defined('ABSPATH')) {
	exit;
}

class Dreamsai_Widget_Recent_Posts extends WP_Widget
{
	/**
	 * Sets up a new Recent Posts widget instance.
	 */
	public function __construct()
	{
		$widget_ops = array(
			'classname' => 'widget_recent_entries',
			'description' => __('Your site&#8217;s most recent Posts.'),
			'customize_selective_refresh' => true,
			'show_instance_in_rest' => true,
		);
		parent::__construct('recent-posts', __('Recent Posts'), $widget_ops);
		$this->alt_option_name = 'widget_recent_entries';
	}

	/**
	 * Outputs the content for the current Recent Posts widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $args     Display arguments including 'before_title', 'after_title',
	 *                        'before_widget', and 'after_widget'.
	 * @param array $instance Settings for the current Recent Posts widget instance.
	 */
	public function widget($args, $instance)
	{
		if (!isset($args['widget_id'])) {
			$args['widget_id'] = $this->id;
		}

		$default_title = __('Recent Posts');
		$title = (!empty($instance['title'])) ? $instance['title'] : $default_title;

		/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.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;

		$r = new WP_Query(
			/**
			 * Filters the arguments for the Recent Posts widget.
			 *
			 * @since 3.4.0
			 * @since 4.9.0 Added the `$instance` parameter.
			 *
			 * @see WP_Query::get_posts()
			 *
			 * @param array $args     An array of arguments used to retrieve the recent posts.
			 * @param array $instance Array of settings for the current widget.
			 */
			apply_filters(
				'widget_posts_args',
				array(
					'posts_per_page' => $number,
					'no_found_rows' => true,
					'post_status' => 'publish',
					'ignore_sticky_posts' => true,
				),
				$instance
			)
		);

		if (!$r->have_posts()) {
			return;
		}

		// Custom HTML structure
		?>
		<div class="card sidebar-item">
			<div class="card-header">
				<h4 class="sidebar-widget-title"><?php echo esc_html($title); ?></h4>
			</div>
			<div class="card-body">
				<ul class="recent-posts list-unstyled mb-0">
					<?php

					foreach ($r->posts as $recent_post) {
						$post_title = get_the_title($recent_post->ID);
						$title = (!empty($post_title)) ? $post_title : __('(no title)');
						$aria_label = sprintf(__('Post details page link: %s'), $title);
						$post_date = get_the_date('d M Y', $recent_post->ID);
						$post_link = get_permalink($recent_post->ID);
						$post_thumb = get_the_post_thumbnail_url($recent_post->ID, 'thumbnail');
						$default_thumb = get_template_directory_uri() . '/assets/img/blog/blog-sidebar-img-01.jpg';
						?>
						<li class="mb-3 pb-3 border-bottom">
							<article class="post-style d-flex align-items-start gap-3 mt-0">
								<?php

								// Post thumbnail
								?>
								<a href="<?php echo esc_url($post_link); ?>" aria-label="<?php echo esc_attr($aria_label); ?>"
									class="post-thumbnail overflow-hidden flex-shrink-0">
									<img src="<?php echo esc_url($post_thumb ? $post_thumb : $default_thumb); ?>"
										alt="<?php echo esc_attr($title); ?>" class="img-fluid rounded" width="80" height="80">
								</a>
								<?php

								// Post info
								?>
								<div class="post-info flex-grow-1">
									<h3 class="post-title mb-2">
										<a href="<?php echo esc_url($post_link); ?>"
											aria-label="<?php echo esc_attr($aria_label); ?>"
											class="text-dark text-decoration-none fw-semibold fs-6 lh-sm">
											<?php echo esc_html($title); ?>
										</a>
									</h3>

									<?php if ($show_date): ?>
										<div class="post-meta text-muted small"><?php echo esc_html($post_date); ?></div>
									<?php endif; ?>
								</div>
							</article>
						</li>

						<?php
					}
					?>
				</ul> 
			</div>
		</div>
		<?php
	}

	/**
	 * Handles updating the settings for the current Recent Posts widget instance.
	 *
	 * @since 2.8.0
	 *
	 * @param array $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array $old_instance Old settings for this instance.
	 * @return array Updated settings to save.
	 */
	public function update($new_instance, $old_instance)
	{
		$instance = $old_instance;
		$instance['title'] = sanitize_text_field($new_instance['title']);
		$instance['number'] = (int) $new_instance['number'];
		$instance['show_date'] = isset($new_instance['show_date']) ? (bool) $new_instance['show_date'] : false;
		return $instance;
	}

	/**
	 * Outputs the settings form for the Recent Posts widget.
	 *
	 * @since 2.8.0
	 *
	 * @param array $instance Current settings.
	 */
	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:'); ?></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:'); ?></label>
			<input class="tiny-text" id="<?php echo $this->get_field_id('number'); ?>"
				name="<?php echo $this->get_field_name('number'); ?>" type="number" step="1" min="1"
				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?'); ?></label>
		</p>
		<?php
	}
}

function dreamsai_register_widget()
{
	register_widget('Dreamsai_Widget_Recent_Posts');
}
add_action('widgets_init', 'dreamsai_register_widget');