File: /mnt/data/dreamssalon-wp/wp-content/plugins/dreamsalon-widgets/widgets/class-home1-blog-section.php
<?php
/**
* DS Home1 Blog Section Widget
*/
namespace dreamsalonelementor\Widgets;
use Elementor\Widget_Base;
use Elementor\Controls_Manager;
use Elementor\Group_Control_Typography;
if (!defined('ABSPATH')) { exit; }
class DSHome1BlogSection extends Widget_Base {
public function get_name() { return 'dreamsalon-home1-blog-section'; }
public function get_title() { return __('Home1 Blog Section', 'dreamsalon_elementor'); }
public function get_icon() { return 'eicon-posts-grid'; }
public function get_categories() { return ['dreamsalonelemetortheme']; }
protected function _register_controls() {
// Content: Header
$this->start_controls_section('header_content', [ 'label' => __('Header', 'dreamsalon_elementor') ]);
$this->add_control('sec_title', [
'label' => __('Section Title', 'dreamsalon_elementor'),
'type' => Controls_Manager::TEXT,
'default' => __('Recent Articles', 'dreamsalon_elementor'),
]);
$this->add_control('sec_subtitle', [
'label' => __('Section Sub Title', 'dreamsalon_elementor'),
'type' => Controls_Manager::TEXT,
'default' => __('Glow Up With Our Latest Articles', 'dreamsalon_elementor'),
]);
$this->add_control('layout_style', [
'label' => __('Layout Style', 'dreamsalon_elementor'),
'type' => Controls_Manager::SELECT,
'default' => 'style1',
'options' => [
'style1' => __('Style 1 (Default)', 'dreamsalon_elementor'),
'style2' => __('Style 2 (Cards)', 'dreamsalon_elementor'),
],
]);
$this->end_controls_section();
// Content: Query
$this->start_controls_section('query_content', [ 'label' => __('Query', 'dreamsalon_elementor') ]);
$this->add_control('posts_per_page', [
'label' => __('Posts Per Page', 'dreamsalon_elementor'),
'type' => Controls_Manager::NUMBER,
'min' => 1,
'step' => 1,
'default' => 3,
]);
$this->add_control('include_cats', [
'label' => __('Include Categories (IDs comma separated)', 'dreamsalon_elementor'),
'type' => Controls_Manager::TEXT,
'placeholder' => __('e.g. 3,7,12', 'dreamsalon_elementor'),
]);
$this->add_control('orderby', [
'label' => __('Order By', 'dreamsalon_elementor'),
'type' => Controls_Manager::SELECT,
'default' => 'date',
'options' => [ 'date' => __('Date', 'dreamsalon_elementor'), 'title' => __('Title', 'dreamsalon_elementor'), 'comment_count' => __('Comment Count', 'dreamsalon_elementor'), 'rand' => __('Random', 'dreamsalon_elementor') ],
]);
$this->add_control('order', [
'label' => __('Order', 'dreamsalon_elementor'),
'type' => Controls_Manager::SELECT,
'default' => 'DESC',
'options' => [ 'DESC' => __('DESC', 'dreamsalon_elementor'), 'ASC' => __('ASC', 'dreamsalon_elementor') ],
]);
$this->end_controls_section();
// Content: Links & Buttons
$this->start_controls_section('links_content', [ 'label' => __('Links & Buttons', 'dreamsalon_elementor') ]);
$this->add_control('read_more_text', [
'label' => __('Read More Text', 'dreamsalon_elementor'),
'type' => Controls_Manager::TEXT,
'default' => __('Read More', 'dreamsalon_elementor'),
]);
$this->add_control('view_more_text', [
'label' => __('View More Button Text', 'dreamsalon_elementor'),
'type' => Controls_Manager::TEXT,
'default' => __('More Articles', 'dreamsalon_elementor'),
]);
$this->add_control('view_more_url', [
'label' => __('View More URL', 'dreamsalon_elementor'),
'type' => Controls_Manager::URL,
'default' => [ 'url' => get_post_type_archive_link('post') ?: home_url('/blog/') ],
]);
$this->end_controls_section();
// Content: Booking CTA
$this->start_controls_section('cta_content', [ 'label' => __('Booking CTA', 'dreamsalon_elementor') ]);
$this->add_control('cta_enable', [
'label' => __('Show Booking CTA', 'dreamsalon_elementor'),
'type' => Controls_Manager::SWITCHER,
'label_on' => __('Show', 'dreamsalon_elementor'),
'label_off' => __('Hide', 'dreamsalon_elementor'),
'return_value' => 'yes',
'default' => 'yes',
]);
$this->add_control('cta_title', [
'label' => __('CTA Title', 'dreamsalon_elementor'),
'type' => Controls_Manager::TEXT,
'default' => __('Enhance Your Bookings with Dream Salon', 'dreamsalon_elementor'),
]);
$this->add_control('cta_desc', [
'label' => __('CTA Description', 'dreamsalon_elementor'),
'type' => Controls_Manager::TEXTAREA,
'default' => __('Join our platform to showcase your salon services and attract more customers. Grow your brand, increase bookings, and connect with a wider beauty community.', 'dreamsalon_elementor'),
]);
$this->add_control('cta_button_text', [
'label' => __('CTA Button Text', 'dreamsalon_elementor'),
'type' => Controls_Manager::TEXT,
'default' => __('Become a Vendor', 'dreamsalon_elementor'),
]);
$this->add_control('cta_button_url', [
'label' => __('CTA Button URL', 'dreamsalon_elementor'),
'type' => Controls_Manager::URL,
'default' => [ 'url' => '#' ],
]);
$this->add_control('cta_image', [
'label' => __('CTA Right Image', 'dreamsalon_elementor'),
'type' => Controls_Manager::MEDIA,
'default' => [ 'url' => '' ],
]);
$this->add_control('cta_bg', [
'label' => __('CTA Background Shape', 'dreamsalon_elementor'),
'type' => Controls_Manager::MEDIA,
'default' => [ 'url' => '' ],
]);
$this->end_controls_section();
// Style: Section
$this->start_controls_section('section_style', [ 'label' => __('Section', 'dreamsalon_elementor'), 'tab' => Controls_Manager::TAB_STYLE ]);
$this->add_responsive_control('section_padding', [
'label' => __('Padding', 'dreamsalon_elementor'),
'type' => Controls_Manager::DIMENSIONS,
'size_units' => ['px','%','em','rem'],
'selectors' => [ '{{WRAPPER}} .blog-section.section, {{WRAPPER}} .blog-section-two.section' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};' ],
]);
$this->end_controls_section();
// Style: Header
$this->start_controls_section('header_style', [ 'label' => __('Header', 'dreamsalon_elementor'), 'tab' => Controls_Manager::TAB_STYLE ]);
$this->add_group_control(Group_Control_Typography::get_type(), [
'name' => 'title_typo',
'label' => __('Title Typography', 'dreamsalon_elementor'),
'selector' => '{{WRAPPER}} .section-header .title',
]);
$this->add_control('title_color', [
'label' => __('Title Color', 'dreamsalon_elementor'),
'type' => Controls_Manager::COLOR,
'selectors' => [ '{{WRAPPER}} .section-header .title' => 'color: {{VALUE}};' ],
]);
$this->add_group_control(Group_Control_Typography::get_type(), [
'name' => 'subtitle_typo',
'label' => __('Subtitle Typography', 'dreamsalon_elementor'),
'selector' => '{{WRAPPER}} .section-header p',
]);
$this->add_control('subtitle_color', [
'label' => __('Subtitle Color', 'dreamsalon_elementor'),
'type' => Controls_Manager::COLOR,
'selectors' => [ '{{WRAPPER}} .section-header p' => 'color: {{VALUE}};' ],
]);
$this->end_controls_section();
// Style: Card
$this->start_controls_section('card_style', [ 'label' => __('Card', 'dreamsalon_elementor'), 'tab' => Controls_Manager::TAB_STYLE ]);
$this->add_group_control(Group_Control_Typography::get_type(), [
'name' => 'card_title_typo',
'label' => __('Card Title Typography', 'dreamsalon_elementor'),
'selector' => '{{WRAPPER}} .blog-item .blog-content h3',
]);
$this->add_control('card_title_color', [
'label' => __('Card Title Color', 'dreamsalon_elementor'),
'type' => Controls_Manager::COLOR,
'selectors' => [ '{{WRAPPER}} .blog-item .blog-content h3 a' => 'color: {{VALUE}};' ],
]);
$this->add_group_control(Group_Control_Typography::get_type(), [
'name' => 'card_text_typo',
'label' => __('Card Text Typography', 'dreamsalon_elementor'),
'selector' => '{{WRAPPER}} .blog-item .blog-content p',
]);
$this->add_control('card_text_color', [
'label' => __('Card Text Color', 'dreamsalon_elementor'),
'type' => Controls_Manager::COLOR,
'selectors' => [ '{{WRAPPER}} .blog-item .blog-content p' => 'color: {{VALUE}};' ],
]);
$this->end_controls_section();
// Style: Buttons
$this->start_controls_section('button_style', [ 'label' => __('Buttons', 'dreamsalon_elementor'), 'tab' => Controls_Manager::TAB_STYLE ]);
$this->add_group_control(Group_Control_Typography::get_type(), [
'name' => 'btn_typo',
'label' => __('Button Typography', 'dreamsalon_elementor'),
'selector' => '{{WRAPPER}} .view-more .btn, {{WRAPPER}} .booking-content .btn',
]);
$this->add_control('btn_text_color', [
'label' => __('Button Text Color', 'dreamsalon_elementor'),
'type' => Controls_Manager::COLOR,
'selectors' => [ '{{WRAPPER}} .view-more .btn, {{WRAPPER}} .booking-content .btn' => 'color: {{VALUE}};' ],
]);
$this->add_control('btn_bg_color', [
'label' => __('Button Background', 'dreamsalon_elementor'),
'type' => Controls_Manager::COLOR,
'selectors' => [ '{{WRAPPER}} .view-more .btn, {{WRAPPER}} .booking-content .btn' => 'background-color: {{VALUE}};' ],
]);
$this->end_controls_section();
}
protected function render() {
$s = $this->get_settings_for_display();
$title = !empty($s['sec_title']) ? $s['sec_title'] : '';
$subtitle = !empty($s['sec_subtitle']) ? $s['sec_subtitle'] : '';
$layout_style = !empty($s['layout_style']) ? $s['layout_style'] : 'style1';
$ppp = !empty($s['posts_per_page']) ? absint($s['posts_per_page']) : 3;
$orderby = !empty($s['orderby']) ? $s['orderby'] : 'date';
$order = !empty($s['order']) ? $s['order'] : 'DESC';
$cat_ids = [];
if (!empty($s['include_cats'])) {
$parts = array_map('trim', explode(',', $s['include_cats']));
foreach ($parts as $p) { if ($p !== '') $cat_ids[] = (int)$p; }
}
$args = [
'post_type' => 'post',
'posts_per_page' => $ppp,
'orderby' => $orderby,
'order' => $order,
'ignore_sticky_posts' => true,
];
if (!empty($cat_ids)) {
$args['tax_query'] = [[
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => $cat_ids,
]];
}
$q = new \WP_Query($args);
$view_more_text = !empty($s['view_more_text']) ? $s['view_more_text'] : '';
$view_more_url = !empty($s['view_more_url']['url']) ? $s['view_more_url']['url'] : (get_post_type_archive_link('post') ?: '#');
$read_more_text = !empty($s['read_more_text']) ? $s['read_more_text'] : __('Read More', 'dreamsalon_elementor');
$cta_enable = isset($s['cta_enable']) && $s['cta_enable'] === 'yes';
$cta_title = !empty($s['cta_title']) ? $s['cta_title'] : '';
$cta_desc = !empty($s['cta_desc']) ? $s['cta_desc'] : '';
$cta_btn_text = !empty($s['cta_button_text']) ? $s['cta_button_text'] : '';
$cta_btn_url = !empty($s['cta_button_url']['url']) ? $s['cta_button_url']['url'] : '#';
$cta_img = !empty($s['cta_image']['url']) ? $s['cta_image']['url'] : '';
$cta_bg = !empty($s['cta_bg']['url']) ? $s['cta_bg']['url'] : '';
?>
<?php if ($layout_style === 'style2') : ?>
<section class="blog-section-two section bg-light z-0">
<img src="<?php echo esc_url( get_template_directory_uri() . '/assets/img/home-2/shape-04.svg' ); ?>" alt="blog-shape" class="blog-section-bg position-absolute d-lg-flex home-5-shape d-none z-n1">
<div class="container">
<div class="section-header title-two text-center wow fadeInUp" data-wow-duration="3s">
<?php if ($title): ?><h2 class="title"><?php echo wp_kses_post($title); ?></h2><?php endif; ?>
<?php if ($subtitle): ?><p><?php echo wp_kses_post($subtitle); ?></p><?php endif; ?>
</div>
<div class="row row-gap-4 justify-content-between">
<?php if ($q->have_posts()): while ($q->have_posts()): $q->the_post();
$permalink = get_permalink();
$p_title = get_the_title();
$thumb = get_the_post_thumbnail_url(get_the_ID(), 'large');
$excerpt = wp_trim_words(get_the_excerpt(), 20);
$author_id = get_the_author_meta('ID');
$author_name = get_the_author();
$author_url = get_author_posts_url($author_id);
$author_avatar = get_avatar_url($author_id, ['size' => 64]);
?>
<div class="col-xl-4 col-md-6 wow fadeInUp" data-wow-duration="3s">
<div class="blog-item-two">
<div class="blog-img shiny overflow-hidden position-relative">
<a href="<?php echo esc_url($permalink); ?>">
<?php if ($thumb): ?>
<img src="<?php echo esc_url($thumb); ?>" alt="<?php echo esc_attr($p_title); ?>" class="img-fluid rounded-3">
<?php endif; ?>
</a>
</div>
<div class="blog-item-two-content">
<h3 class="mb-1"><a href="<?php echo esc_url($permalink); ?>"><?php echo esc_html($p_title); ?></a></h3>
<p class="mb-3"><?php echo esc_html($excerpt); ?></p>
<div class="d-flex align-items-center justify-content-between">
<div class="d-flex align-items-center">
<a href="<?php echo esc_url($author_url); ?>"><img src="<?php echo esc_url($author_avatar); ?>" alt="<?php echo esc_attr($author_name); ?>" class="avatar avatar-md rounded-circle me-2"></a>
<a href="<?php echo esc_url($author_url); ?>"><?php echo esc_html($author_name); ?></a>
</div>
<a href="<?php echo esc_url($permalink); ?>" class="read-more text-decoration-underline"><?php echo esc_html($read_more_text); ?></a>
</div>
</div>
</div>
</div>
<?php endwhile; wp_reset_postdata(); endif; ?>
</div>
</div>
</section>
<?php else : ?>
<section class="blog-section section">
<div class="container">
<div class="section-header text-center wow fadeInUp">
<?php if ($subtitle): ?><div class="sub-ttitle py-2 px-3 rounded-pill"><span class="clircle me-2"></span><?php echo wp_kses_post($subtitle); ?></div><?php endif; ?>
<?php if ($title): ?><h2 class="title mt-2 title_style1"><?php echo wp_kses_post($title); ?></h2><?php endif; ?>
</div>
<div class="row row-gap-4 justify-content-between">
<?php if ($q->have_posts()): while ($q->have_posts()): $q->the_post();
$permalink = get_permalink();
$p_title = get_the_title();
$thumb = get_the_post_thumbnail_url(get_the_ID(), 'large');
$excerpt = wp_trim_words(get_the_excerpt(), 20);
$author_id = get_the_author_meta('ID');
$author_name = get_the_author();
$author_url = get_author_posts_url($author_id);
$author_avatar = get_avatar_url($author_id, ['size' => 64]);
$cats = get_the_category();
$cat = !empty($cats) ? $cats[0] : null;
$cat_link = $cat ? get_category_link($cat->term_id) : '#';
$cat_name = $cat ? $cat->name : '';
$comment_count = get_comments_number(get_the_ID()); // total comments
?>
<div class="col-lg-4 col-md-6 d-flex">
<div class="blog-item style1 flex-fill wow fadeInUp" data-wow-duration="3s">
<div class="blog-content">
<div class="blog-img mb-3 d-flex align-items-center">
<a href="<?php echo esc_url($permalink); ?>">
<?php if ($thumb): ?>
<img src="<?php echo esc_url($thumb); ?>" class="img-fluid" alt="<?php echo esc_attr($p_title); ?>">
<?php endif; ?>
</a>
<span class="fs-14 badge bg-white rounded-pill text-muted">
<?php echo esc_html( get_the_date('d M, Y', get_the_ID()) ); ?>
</span>
</div>
<div class=" border-bottom pb-3 mb-3 ">
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2">
<a href="<?php echo esc_url($author_url); ?>" class="text-capitalize fs-14"><i class="ti ti-user-circle me-1 position-relative top-1"></i><?php echo esc_html($author_name); ?></a>
<span class="fs-14">
<i class="ti ti-message-circle position-relative top-1 me-1"></i><?php echo esc_html('Comments (' . $comment_count . ')' ); ?>
</span>
</div>
</div>
<h3 class="text-truncate"><a href="<?php echo esc_url($permalink); ?>"><?php echo esc_html($p_title); ?></a></h3>
<p class="fs-16"><?php echo esc_html($excerpt); ?></p>
<div class="d-flex align-items-center justify-content-between flex-wrap gap-2">
<a href="<?php echo esc_url($permalink); ?>" class=" fs-14 fw-medium"><b><?php echo esc_html($read_more_text); ?> <i class="ti ti-arrow-right position-relative ms-1 mt-1 top-1"></i></b></a>
</div>
</div>
</div>
</div>
<?php endwhile; wp_reset_postdata(); endif; ?>
</div>
<?php if (!empty($view_more_text)): ?>
<div class="text-center view-more">
<a href="<?php echo esc_url($view_more_url); ?>" class="btn rounded-pill btn-dark d-inline-flex align-items-center"><?php echo esc_html($view_more_text); ?><i class="ti ti-chevron-right ms-1 position-relative top-1"></i></a>
</div>
<?php endif; ?>
<?php if ($cta_enable): ?>
<div class="booking-wrap wow fadeInUp" data-wow-duration="3s">
<div class="row">
<div class="col-lg-6">
<div class="booking-content">
<?php if ($cta_title): ?><h2 class="mb-2"><?php echo esc_html($cta_title); ?></h2><?php endif; ?>
<?php if ($cta_desc): ?><p><?php echo esc_html($cta_desc); ?></p><?php endif; ?>
<?php if ($cta_btn_text): ?><a href="<?php echo esc_url($cta_btn_url); ?>" class="btn btn-white d-inline-flex align-items-center"><?php echo esc_html($cta_btn_text); ?><i class="ti ti-chevron-right ms-1"></i></a><?php endif; ?>
</div>
</div>
<div class="col-lg-6">
<div class="booking-img wow zoom-in" data-wow-duration="3s">
<?php if ($cta_img): ?><img src="<?php echo esc_url($cta_img); ?>" class="img-fluid" alt="booking"><?php endif; ?>
</div>
</div>
</div>
<?php if ($cta_bg): ?><img src="<?php echo esc_url($cta_bg); ?>" alt="shape" class="booking-bg"><?php endif; ?>
</div>
<?php endif; ?>
</div>
</section>
<?php endif; ?>
<?php
}
}