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/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
    }
}