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’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');