Files
wordpress-theme-aksrt/templates/parts/home-modules/module-banner.php
T

114 lines
5.4 KiB
PHP

<?php
/**
* Home Module · Banner — v4.0 Zibll-Inspired
*
* 内联轮播条,使用与 header-slider 相同的 Swiper 架构,
* 但以圆角卡片形式嵌入内容流中(非全宽)。
*
* 支持配置:
* - 自动播放
* - 圆角卡片样式
* - 标题/副标题叠加
* - 点击跳转
*
* @package AKSRT
* @version 4.0.0
*/
defined('ABSPATH') || exit;
if (class_exists('\AKSRT\Settings\Settings') && !\AKSRT\Settings\Settings::homepage_module_banner_enabled()) {
return;
}
$banners = function_exists('aksrt_get_banners') ? aksrt_get_banners(8) : [];
if (empty($banners)) {
if (current_user_can('manage_options')) {
echo '<div class="home-module home-module--banner home-module--banner-empty box-body">';
echo '<p class="muted-2-color">' . esc_html__('No Banner slides found. Add banner slides in admin.', 'aksrt') . '</p>';
if (function_exists('aksrt_render_admin_quick_link')) {
echo '<div class="home-module__admin-tools">';
aksrt_render_admin_quick_link('page-display/banner', __('Banner 轮播管理', 'aksrt'));
echo '</div>';
}
echo '</div>';
}
return;
}
$cfg = get_query_var('aksrt_module_config', []);
if (!is_array($cfg)) $cfg = [];
$slide_count = count($banners);
// Swiper config — Banner uses a subset of the global slider config
$slider_cfg = function_exists('aksrt_get_slider_config') ? aksrt_get_slider_config() : [];
$swiper_config = [
'effect' => 'slide', // Banner always uses slide effect
'loop' => $slide_count > 1 && ($slider_cfg['loop'] ?? true),
'speed' => 500,
'autoplay' => $slide_count > 1 ? ['delay' => ($slider_cfg['autoplay_interval'] ?? 5000), 'disableOnInteraction' => false] : false,
'pagination' => false,
'navigation' => !empty($slider_cfg['navigation']),
'keyboard' => ['enabled' => true],
'spaceBetween' => ($slider_cfg['space_between'] ?? 0),
];
?>
<div class="home-module home-module--banner slide-widget mb20">
<div class="banner-module zib-slider">
<div class="swiper new-swiper banner-module__swiper slide-widget-swiper" data-swiper-config="<?php echo esc_attr(wp_json_encode($swiper_config)); ?>">
<div class="swiper-wrapper">
<?php foreach ($banners as $index => $slide) :
$device_vis = $slide['device_visibility'] ?? 'all';
$slide_classes = 'swiper-slide';
if ($device_vis === 'pc') {
$slide_classes .= ' banner-slide--pc-only';
} elseif ($device_vis === 'mobile') {
$slide_classes .= ' banner-slide--mobile-only';
}
$link_target = !empty($slide['link_target']) ? $slide['link_target'] : '_self';
?>
<div class="<?php echo esc_attr($slide_classes); ?>"<?php if (!empty($slide['link'])) : ?> data-link="<?php echo esc_url($slide['link']); ?>" data-target="<?php echo esc_attr($link_target); ?>"<?php endif; ?>>
<div class="banner-module__slide-bg">
<?php if (!empty($slide['image'])) : ?>
<img<?php echo aksrt_get_lazy_attr('lazy_sider', (string) $slide['image'], 'fit-cover', aksrt_get_lazy_thumb('lg')); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
alt="<?php echo esc_attr($slide['title'] ?: get_bloginfo('name')); ?>"
decoding="async"
>
<?php else : ?>
<div class="banner-module__slide-fallback"></div>
<?php endif; ?>
</div>
<div class="banner-module__slide-overlay"></div>
<?php
$show_text = !isset($slide['show_text']) || $slide['show_text'];
$has_title = !empty($slide['title']);
$has_subtitle = !empty($slide['subtitle']);
?>
<?php if ($show_text && ($has_title || $has_subtitle)) : ?>
<div class="banner-module__content">
<?php if ($has_title) : ?>
<h3 class="banner-module__title"><?php echo esc_html($slide['title']); ?></h3>
<?php endif; ?>
<?php if ($has_subtitle) : ?>
<p class="banner-module__subtitle"><?php echo esc_html($slide['subtitle']); ?></p>
<?php endif; ?>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
<?php if ($slide_count > 1) : ?>
<!-- 前后箭头 -->
<div class="banner-module__prev swiper-button-prev"></div>
<div class="banner-module__next swiper-button-next"></div>
<?php endif; ?>
</div>
</div>
<?php if (function_exists('aksrt_render_admin_quick_link')) : ?>
<div class="home-module__admin-tools">
<?php aksrt_render_admin_quick_link('page-display/banner', __('Banner 轮播管理', 'aksrt')); ?>
</div>
<?php endif; ?>
</div>