Files
shopify-ai-backup/chat/templates/Announcements/public/class-frontend.php

239 lines
8.8 KiB
PHP

<?php
/**
* Frontend class for displaying announcements on public pages
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
class PC_Announcements_274_Frontend {
/**
* Constructor
*/
public function __construct() {
add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_scripts'));
add_action('wp_head', array($this, 'display_announcements'), 1);
add_shortcode('pc_announcements_274', array($this, 'get_announcements_for_shortcode'));
}
/**
* Enqueue frontend scripts and styles
*/
public function enqueue_frontend_scripts() {
wp_enqueue_style('pc-announcements-274-public-style', PC_ANNOUNCEMENTS_274_PLUGIN_URL . 'public/css/public-style.css', array(), PC_ANNOUNCEMENTS_274_VERSION);
wp_enqueue_script('pc-announcements-274-public-script', PC_ANNOUNCEMENTS_274_PLUGIN_URL . 'public/js/public-script.js', array('jquery'), PC_ANNOUNCEMENTS_274_VERSION, true);
}
/**
* Get active announcements
*/
private function get_active_announcements() {
global $wpdb;
$table_name = PC_Announcements_274_Install::get_table_name();
if (empty($table_name)) {
return array();
}
$current_time = current_time('mysql');
$announcements = $wpdb->get_results($wpdb->prepare("
SELECT * FROM $table_name
WHERE status = %s
AND (start_date IS NULL OR start_date <= %s)
AND (end_date IS NULL OR end_date >= %s)
ORDER BY created_at DESC
", 'active', $current_time, $current_time));
if ($announcements === null) {
return array();
}
return $announcements;
}
/**
* Display announcements at the top of pages
*/
public function display_announcements() {
// Don't show on admin pages or in WordPress admin
if (is_admin()) {
return;
}
$announcements = $this->get_active_announcements();
if (empty($announcements)) {
return;
}
// Display only the most recent active announcement
$announcement = $announcements[0];
$this->render_announcement($announcement);
}
/**
* Render single announcement
*/
private function render_announcement($announcement) {
$title = esc_html($announcement->title);
$message = wpautop(wp_kses_post($announcement->message));
$image_url = esc_url($announcement->image_url);
$banner_color = esc_attr($announcement->banner_color);
$link_url = esc_url($announcement->link_url);
$close_text = __('Close', 'pc-announcements-274');
$banner_style = '';
if (!empty($banner_color) && $banner_color !== '#0d47a1') {
$banner_style = 'background: ' . $banner_color . ';';
}
$has_link = !empty($link_url);
$link_attrs = $has_link ? 'href="' . $link_url . '" target="_blank" rel="noopener noreferrer"' : '';
$close_button = $has_link ? '' : '<button class="pc-announcements-274-close" aria-label="' . esc_attr($close_text) . '">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>';
?>
<div class="pc-announcements-274-announcement" data-announcement-id="<?php echo $announcement->id; ?>" style="<?php echo $banner_style; ?>">
<div class="pc-announcements-274-container">
<div class="pc-announcements-274-content">
<?php if ($has_link): ?>
<a class="pc-announcements-274-link" <?php echo $link_attrs; ?>>
<?php endif; ?>
<?php if (!empty($image_url)): ?>
<div class="pc-announcements-274-image">
<img src="<?php echo $image_url; ?>" alt="<?php echo esc_attr($title); ?>" loading="lazy">
</div>
<?php endif; ?>
<div class="pc-announcements-274-text">
<?php if (!empty($title)): ?>
<h3 class="pc-announcements-274-title"><?php echo $title; ?></h3>
<?php endif; ?>
<?php if (!empty(trim($message))): ?>
<div class="pc-announcements-274-message">
<?php echo $message; ?>
</div>
<?php endif; ?>
</div>
<?php if ($has_link): ?>
</a>
<?php endif; ?>
</div>
<?php echo $close_button; ?>
</div>
</div>
<?php
}
/**
* Get announcements for shortcode
*/
public function get_announcements_for_shortcode($atts) {
$atts = shortcode_atts(array(
'count' => 1,
'show_image' => true,
'show_close' => true,
'class' => ''
), $atts, 'pc_announcements_274');
$announcements = $this->get_active_announcements();
if (empty($announcements)) {
return '';
}
$output = '';
$count = min(intval($atts['count']), count($announcements));
$show_image = filter_var($atts['show_image'], FILTER_VALIDATE_BOOLEAN);
$show_close = filter_var($atts['show_close'], FILTER_VALIDATE_BOOLEAN);
$custom_class = sanitize_html_class($atts['class']);
for ($i = 0; $i < $count; $i++) {
$announcement = $announcements[$i];
$output .= $this->render_announcement_html($announcement, $show_image, $show_close, $custom_class);
}
return $output;
}
/**
* Render announcement as HTML string
*/
private function render_announcement_html($announcement, $show_image = true, $show_close = true, $custom_class = '') {
$title = esc_html($announcement->title);
$message = wpautop(wp_kses_post($announcement->message));
$image_url = esc_url($announcement->image_url);
$banner_color = esc_attr($announcement->banner_color);
$link_url = esc_url($announcement->link_url);
$close_text = __('Close', 'pc-announcements-274');
$class_names = array('pc-announcements-274-announcement');
if (!empty($custom_class)) {
$class_names[] = $custom_class;
}
$banner_style = '';
if (!empty($banner_color) && $banner_color !== '#0d47a1') {
$banner_style = 'style="background: ' . $banner_color . ';"';
}
$has_link = !empty($link_url);
$link_attrs = $has_link ? 'href="' . $link_url . '" target="_blank" rel="noopener noreferrer"' : '';
$html = '<div class="' . implode(' ', $class_names) . '" data-announcement-id="' . $announcement->id . '" ' . $banner_style . '>';
$html .= '<div class="pc-announcements-274-container">';
$html .= '<div class="pc-announcements-274-content">';
if ($has_link) {
$html .= '<a class="pc-announcements-274-link" ' . $link_attrs . '>';
}
if ($show_image && !empty($image_url)) {
$html .= '<div class="pc-announcements-274-image">';
$html .= '<img src="' . $image_url . '" alt="' . esc_attr($title) . '" loading="lazy">';
$html .= '</div>';
}
$html .= '<div class="pc-announcements-274-text">';
if (!empty($title)) {
$html .= '<h3 class="pc-announcements-274-title">' . $title . '</h3>';
}
if (!empty(trim($message))) {
$html .= '<div class="pc-announcements-274-message">' . $message . '</div>';
}
$html .= '</div>';
if ($has_link) {
$html .= '</a>';
}
$html .= '</div>';
if ($show_close && !$has_link) {
$html .= '<button class="pc-announcements-274-close" aria-label="' . esc_attr($close_text) . '">';
$html .= '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">';
$html .= '<path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>';
$html .= '</svg>';
$html .= '</button>';
}
$html .= '</div>';
$html .= '</div>';
return $html;
}
}