Files
wordpress-theme-aksrt/footer.php
T
kate522 70cba11fb7 feat(icons): wire the universal picker into tabbar/floating settings and keep customsvg through their save paths
手机底部Tab and 右侧悬浮按钮 settings pages swap their icon text inputs
for the shared FaIconPicker (with a new IconValue preview component that
renders FA/sprite/custom SVG values in lists and previews). footer.php
tabbar/floating/sub-item icons and the VIP float render through
aksrt_icon_markup so every stored format displays; GlobalControllerPart1
and the VIP helper drop the FA-only regex gate and sanitize icon values
through aksrt_sanitize_icon_value. The picker popover tabs now wrap
instead of overflowing, and FA grid previews use style-only classes.
2026-09-06 14:27:49 +08:00

413 lines
20 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 站点页脚 — legacy template_1 shell
*
* 主内容区对齐 legacy `legacy` 契约;浮动按钮与移动端 tabbar 保留。
*
* @package AKSRT
* @version 4.1.0
*/
defined('ABSPATH') || exit;
// 数据准备
$blog_name = function_exists('aksrt_get_site_logo_text') ? aksrt_get_site_logo_text() : get_bloginfo('name');
$has_settings = class_exists('\AKSRT\Settings\Settings');
// §2.3 三列结构化字段(legacy keys)
$footer_brand = $has_settings ? \AKSRT\Settings\Settings::get_footer_brand_settings() : ['m_s' => ['pc', 'mobile'], 'img' => '', 'img_dark' => '', 'title' => '', 'custom_code' => ''];
$footer_contact_ext = $has_settings ? \AKSRT\Settings\Settings::get_footer_contact_extended_settings() : ['m_s' => ['pc', 'mobile'], 'wechat_img' => '', 'qq' => '', 'weibo' => '', 'email' => '', 'more' => [], 'code_1' => '', 'code_2' => ''];
$footer_mini = $has_settings ? \AKSRT\Settings\Settings::get_footer_mini_img_settings() : ['m_s' => ['pc', 'mobile'], 'items' => [], 'items_2' => []];
$footer_customize_code = $has_settings ? \AKSRT\Settings\Settings::get_footer_customize_code() : '';
$footer_template = $has_settings ? \AKSRT\Settings\Settings::get_footer_template() : 'template_1';
// 设备可见性 → legacy hidden-xs(仅在不含 mobile 时隐藏移动端)
$_brand_show_sm = in_array('mobile', (array) ($footer_brand['m_s'] ?? []), true);
$_contact_show_sm = in_array('mobile', (array) ($footer_contact_ext['m_s'] ?? []), true);
$_mini_show_sm = in_array('mobile', (array) ($footer_mini['m_s'] ?? []), true);
$_brand_xs_cls = $_brand_show_sm ? '' : ' hidden-xs';
$_contact_xs_cls = $_contact_show_sm ? '' : ' hidden-xs';
$_mini_xs_cls = $_mini_show_sm ? '' : ' hidden-xs';
// 品牌 / 联系 / 二维码列内容存在性
$_logo_html = '';
if (function_exists('aksrt_get_adaptive_theme_img')) {
$_logo_html = aksrt_get_adaptive_theme_img(
(string) ($footer_brand['img'] ?? ''),
(string) ($footer_brand['img_dark'] ?? ''),
$blog_name,
'style="height: 40px;"'
);
}
$_has_brand = $_logo_html !== '' || !empty($footer_brand['title']) || !empty($footer_brand['custom_code']);
$_fcode_links = trim((string) ($footer_contact_ext['code_1'] ?? ''));
$_has_contact_icons = !empty($footer_contact_ext['wechat_img'])
|| !empty($footer_contact_ext['qq'])
|| !empty($footer_contact_ext['email'])
|| !empty($footer_contact_ext['more'])
|| !empty($footer_contact_ext['weibo']);
$_has_links_col = $_fcode_links !== '' || !empty($footer_contact_ext['code_2']) || $_has_contact_icons;
$_has_mini = !empty($footer_mini['items']) || !empty($footer_mini['items_2']);
$_has_cols = $_has_brand || $_has_links_col || $_has_mini;
$_footer_conter = wp_kses_post(trim((string) $footer_customize_code));
?>
<?php if (is_active_sidebar('single_bottom_fluid') && is_singular('post')) : ?>
<div class="fluid-widget-wrap">
<?php dynamic_sidebar('single_bottom_fluid'); ?>
</div>
<?php endif; ?>
<?php \AKSRT\WidgetSystem\WidgetAreas::render('all_bottom_fluid', 'fluid-widget-wrap'); ?>
<footer class="footer" data-aksrt-shell="site-footer" data-footer-template="<?php echo esc_attr($footer_template); ?>" role="contentinfo">
<?php if (is_active_sidebar('all_footer')) : ?>
<?php dynamic_sidebar('all_footer'); ?>
<?php endif; ?>
<div class="container-fluid container-footer">
<?php if ($_has_cols) : ?>
<ul class="flex ac gap20 footer-contact-box list-inline">
<?php if ($_has_brand) : ?>
<li class="<?php echo esc_attr(trim($_brand_xs_cls)); ?>" style="max-width: 300px;">
<?php if ($_logo_html !== '') : ?>
<p>
<a class="footer-logo" href="<?php echo esc_url(home_url('/')); ?>" title="<?php echo esc_attr($blog_name); ?>">
<?php echo $_logo_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</a>
</p>
<?php endif; ?>
<?php if (!empty($footer_brand['title'])) : ?>
<p class="title-h-left"><?php echo esc_html($footer_brand['title']); ?></p>
<?php endif; ?>
<?php if (!empty($footer_brand['custom_code'])) : ?>
<div class="footer-muted em09"><?php echo wp_kses_post($footer_brand['custom_code']); ?></div>
<?php endif; ?>
</li>
<?php endif; ?>
<?php if ($_has_links_col) : ?>
<li style="max-width: 550px;">
<?php if ($_fcode_links !== '') : ?>
<p class="fcode-links"><?php echo wp_kses_post($_fcode_links); ?></p>
<?php endif; ?>
<?php if (!empty($footer_contact_ext['code_2'])) : ?>
<div class="footer-muted em09"><?php echo wp_kses_post($footer_contact_ext['code_2']); ?></div>
<?php endif; ?>
<?php if ($_has_contact_icons) : ?>
<div class="footer-contact mt10<?php echo esc_attr($_contact_xs_cls); ?>">
<?php if (!empty($footer_contact_ext['wechat_img'])) : ?>
<a class="toggle-radius hover-show nowave" href="javascript:;" title="<?php esc_attr_e('微信', 'aksrt'); ?>">
<i class="fa fab fa-weixin" aria-hidden="true"></i>
<div class="hover-show-con footer-wechat-img">
<img style="box-shadow: 0 5px 10px rgba(0,0,0,.2); border-radius:4px;" height="100" src="<?php echo esc_url($footer_contact_ext['wechat_img']); ?>" alt="<?php esc_attr_e('微信', 'aksrt'); ?>">
</div>
</a>
<?php endif; ?>
<?php if (!empty($footer_contact_ext['qq'])) : ?>
<a class="toggle-radius" target="_blank" rel="noopener noreferrer" title="<?php esc_attr_e('QQ', 'aksrt'); ?>" href="<?php echo esc_url('https://wpa.qq.com/msgrd?v=3&uin=' . rawurlencode((string) $footer_contact_ext['qq']) . '&site=qq&menu=yes'); ?>">
<i class="fa fab fa-qq" aria-hidden="true"></i>
</a>
<?php endif; ?>
<?php if (!empty($footer_contact_ext['weibo'])) : ?>
<a class="toggle-radius" target="_blank" rel="noopener noreferrer" title="<?php esc_attr_e('微博', 'aksrt'); ?>" href="<?php echo esc_url($footer_contact_ext['weibo']); ?>">
<i class="fa fab fa-weibo" aria-hidden="true"></i>
</a>
<?php endif; ?>
<?php if (!empty($footer_contact_ext['email'])) : ?>
<a class="toggle-radius" title="<?php esc_attr_e('邮箱', 'aksrt'); ?>" href="<?php echo esc_url('mailto:' . $footer_contact_ext['email']); ?>">
<i class="fa fas fa-envelope" aria-hidden="true"></i>
</a>
<?php endif; ?>
<?php foreach ((array) ($footer_contact_ext['more'] ?? []) as $more_item) :
if (!is_array($more_item)) {
continue;
}
$m_img = (string) ($more_item['img'] ?? '');
$m_url = (string) ($more_item['link'] ?? '');
$m_text = (string) ($more_item['desc'] ?? '');
$m_icon = (string) ($more_item['icon'] ?? '');
$m_icon_html = $m_icon !== '' ? aksrt_icon_markup($m_icon) : '';
if ($m_icon_html === '') {
$m_icon_html = '<i class="fa fas fa-heart" aria-hidden="true"></i>';
}
if ($m_img !== '') :
?>
<a class="toggle-radius hover-show nowave" href="javascript:;" title="<?php echo esc_attr($m_text); ?>">
<?php echo $m_icon_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="hover-show-con footer-wechat-img">
<img style="box-shadow: 0 5px 10px rgba(0,0,0,.2); border-radius:4px;" height="100" src="<?php echo esc_url($m_img); ?>" alt="<?php echo esc_attr($m_text); ?>">
</div>
</a>
<?php elseif ($m_url !== '') : ?>
<a class="toggle-radius" target="_blank" rel="noopener noreferrer" title="<?php echo esc_attr($m_text); ?>" href="<?php echo esc_url($m_url); ?>">
<?php echo $m_icon_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</a>
<?php endif; ?>
<?php endforeach; ?>
</div>
<?php endif; ?>
</li>
<?php endif; ?>
<?php if ($_has_mini) : ?>
<li class="<?php echo esc_attr(trim($_mini_xs_cls)); ?>">
<?php foreach (['items' => 'footer-miniimg flex at hh gap6', 'items_2' => 'footer-miniimg-2 flex at hh gap6'] as $items_key => $items_class) : ?>
<?php if (!empty($footer_mini[$items_key])) : ?>
<div class="<?php echo esc_attr($items_class); ?>">
<?php foreach ($footer_mini[$items_key] as $mi) :
$mi_img = (string) ($mi['image'] ?? '');
$mi_text = (string) ($mi['text'] ?? '');
$mi_link = is_array($mi['link'] ?? null) ? $mi['link'] : [];
$mi_url = (string) ($mi_link['url'] ?? '');
$mi_target = (string) ($mi_link['target'] ?? '');
?>
<?php if ($mi_url !== '') : ?>
<a href="<?php echo esc_url($mi_url); ?>"<?php echo $mi_target !== '' ? ' target="' . esc_attr($mi_target) . '"' : ''; ?>>
<?php endif; ?>
<div<?php echo $mi_text !== '' ? ' title="' . esc_attr($mi_text) . '"' : ''; ?>>
<img<?php echo aksrt_get_lazy_attr('lazy_other', $mi_img); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> alt="<?php echo esc_attr($mi_text !== '' ? $mi_text : $blog_name); ?>">
<?php if ($mi_text !== '') : ?>
<div class="opacity8 em09 mt6 text-center"><?php echo esc_html($mi_text); ?></div>
<?php endif; ?>
</div>
<?php if ($mi_url !== '') : ?>
</a>
<?php endif; ?>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php endforeach; ?>
</li>
<?php endif; ?>
</ul>
<?php endif; ?>
<?php if ($_footer_conter !== '') : ?>
<p class="footer-conter"><?php echo $_footer_conter; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p>
<?php endif; ?>
</div>
</footer>
<!-- 浮动右侧按钮组 -->
<?php
$floating_settings = $has_settings ? \AKSRT\Settings\Settings::get_floating_buttons_settings() : [];
$floating_items = $has_settings ? \AKSRT\Settings\Settings::get_floating_buttons_items() : [];
$aksrt_hide_chrome = is_page_template('templates/pages/page-submit.php');
$floating_enabled = !$aksrt_hide_chrome && !empty($floating_settings['enabled']) && !empty($floating_items);
$tabbar_settings = $has_settings ? \AKSRT\Settings\Settings::get_footer_tabbar_settings() : [];
$tabbar_items = $has_settings ? \AKSRT\Settings\Settings::get_footer_tabbar_items() : [];
$tabbar_enabled = !$aksrt_hide_chrome && !empty($tabbar_settings['enabled']) && !empty($tabbar_items);
$floating_classes = 'float-right';
$floating_classes .= ' ' . (!empty($floating_settings['style']) ? sanitize_html_class($floating_settings['style']) : 'round');
$floating_classes .= !empty($floating_settings['position']) && $floating_settings['position'] === 'center' ? ' position-center' : ' position-bottom';
if (!empty($floating_settings['scroll_hide'])) {
$floating_classes .= ' scrolling-hide';
}
if (!empty($floating_settings['scroll_down_hide'])) {
$floating_classes .= ' scroll-down-hide';
}
if (empty($floating_settings['shadow'])) {
$floating_classes .= ' no-shadow';
}
if (empty($floating_settings['animation'])) {
$floating_classes .= ' no-animation';
}
$float_blur = is_array($floating_settings['filter_blur'] ?? null) ? $floating_settings['filter_blur'] : [];
if (in_array('pc', $float_blur, true)) {
$floating_classes .= ' has-blur-pc';
}
if (in_array('mobile', $float_blur, true)) {
$floating_classes .= ' has-blur-mobile';
}
if ($floating_enabled) :
?>
<div id="float-right-btns" class="<?php echo esc_attr($floating_classes); ?>">
<?php foreach ($floating_items as $item) :
$item_type = $item['type'] ?? 'custom';
$item_icon = $item['icon'] ?? 'fa fas fa-circle';
$item_text = $item['text'] ?? '';
$item_url = $item['link'] ?? '#';
$item_target = !empty($item['new_window']) ? ' target="_blank" rel="noopener noreferrer"' : '';
$item_color = $item['color'] ?? '';
$item_bg = $item['bg'] ?? '';
$pc_show = $item['pc_s'] ?? true;
$m_show = $item['m_s'] ?? true;
$item_class = 'float-btn';
$inline_styles = [];
if ($item_color !== '') {
$inline_styles[] = '--this-color:' . esc_attr($item_color);
}
if ($item_bg !== '') {
$inline_styles[] = '--this-bg:' . esc_attr($item_bg);
}
if (!$pc_show) {
$item_class .= ' hide-on-pc';
}
if (!$m_show) {
$item_class .= ' hide-on-mobile';
}
$style_attr = $inline_styles ? ' style="' . implode(';', $inline_styles) . '"' : '';
if ($item_type === 'back_top') :
$item_class .= ' ontop';
?>
<a href="#" class="<?php echo esc_attr($item_class); ?>" id="float-back-to-top" role="button" aria-label="<?php echo esc_attr($item_text ?: __('返回顶部', 'aksrt')); ?>"<?php echo $style_attr; ?>>
<?php echo aksrt_icon_markup((string) $item_icon); // pre-escaped ?>
</a>
<?php elseif ($item_type === 'theme_mode') :
$item_class .= ' theme-toggle-btn';
?>
<a href="#" class="<?php echo esc_attr($item_class); ?>" role="button" data-action="toggle-theme" aria-label="<?php echo esc_attr($item_text ?: __('切换主题', 'aksrt')); ?>"<?php echo $style_attr; ?>>
<i class="fa fas fa-sun float-btn__icon-sun" aria-hidden="true"></i>
<i class="fa fas fa-moon float-btn__icon-moon" aria-hidden="true"></i>
</a>
<?php elseif ($item_type === 'pay_vip') :
$vip_html = function_exists('aksrt_get_float_pay_vip_html') ? aksrt_get_float_pay_vip_html($item) : '';
if ($vip_html !== '') {
echo $vip_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
?>
<?php elseif ($item_type === 'service_wechat') :
$item_class .= ' service-wechat';
$wechat_img = $item['wechat_img'] ?? ($item['qrcode_img'] ?? '');
?>
<a href="#" class="<?php echo esc_attr($item_class); ?>" role="button" aria-label="<?php echo esc_attr($item_text ?: __('微信', 'aksrt')); ?>"<?php echo $style_attr; ?>>
<?php echo aksrt_icon_markup((string) $item_icon); // pre-escaped ?>
<?php if ($wechat_img) : ?>
<div class="hover-show-con">
<img src="<?php echo esc_url($wechat_img); ?>" alt="<?php esc_attr_e('微信二维码', 'aksrt'); ?>">
<?php if ($item_text !== '') : ?><p><?php echo esc_html($item_text); ?></p><?php endif; ?>
</div>
<?php endif; ?>
</a>
<?php elseif ($item_type === 'service_qq') :
$item_class .= ' service-qq';
$qq_number = $item['qq'] ?? '';
$qq_img = $item['qrcode_img'] ?? '';
?>
<a href="<?php echo $qq_number ? esc_url('https://wpa.qq.com/msgrd?v=3&uin=' . $qq_number . '&site=qq&menu=yes') : '#'; ?>" class="<?php echo esc_attr($item_class); ?>" role="button"<?php echo $qq_number ? ' target="_blank" rel="noopener noreferrer"' : ''; ?> aria-label="<?php echo esc_attr($item_text ?: 'QQ'); ?>"<?php echo $style_attr; ?>>
<?php echo aksrt_icon_markup((string) $item_icon); // pre-escaped ?>
<?php if ($qq_img || $qq_number) : ?>
<div class="hover-show-con">
<?php if ($qq_img) : ?>
<img src="<?php echo esc_url($qq_img); ?>" alt="QQ">
<?php endif; ?>
<?php if ($qq_number) : ?><p>QQ: <?php echo esc_html($qq_number); ?></p><?php endif; ?>
</div>
<?php endif; ?>
</a>
<?php elseif ($item_type === 'add') :
$item_class .= ' newadd-btns';
$add_items = is_array($item['add_items'] ?? null) ? $item['add_items'] : [];
?>
<a href="#" class="<?php echo esc_attr($item_class); ?>" role="button" aria-label="<?php echo esc_attr($item_text ?: __('发布', 'aksrt')); ?>"<?php echo $style_attr; ?>>
<?php echo aksrt_icon_markup((string) $item_icon); // pre-escaped ?>
<?php if (!empty($add_items)) : ?>
<div class="hover-show-con">
<div class="float-add-menu">
<?php foreach ($add_items as $sub) :
$sub_url = $sub['url'] ?? '#';
$sub_icon = $sub['icon'] ?? 'fa fas fa-plus';
$sub_text = $sub['text'] ?? '';
?>
<a href="<?php echo esc_url($sub_url); ?>" class="float-add-menu__item">
<?php echo aksrt_icon_markup((string) $sub_icon); // pre-escaped ?>
<span><?php echo esc_html($sub_text); ?></span>
</a>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
</a>
<?php elseif ($item_type === 'qrcode') :
$item_class .= ' qrcode-btn';
?>
<a href="#" class="<?php echo esc_attr($item_class); ?>" role="button" aria-label="<?php echo esc_attr($item_text ?: __('二维码', 'aksrt')); ?>"<?php echo $style_attr; ?>>
<?php echo aksrt_icon_markup((string) $item_icon); // pre-escaped ?>
<div class="hover-show-con">
<div
class="qrcode float-btn-qrcode"
data-qrcode="<?php echo esc_attr(get_permalink() ?: home_url('/')); ?>"
data-size="120"
></div>
<?php if ($item_text !== '') : ?><p class="float-btn-qrcode__title"><?php echo esc_html($item_text); ?></p><?php endif; ?>
</div>
</a>
<?php else :
$hover_html = $item['hover'] ?? '';
$hover_width = (int) ($item['hover_width'] ?? 200);
?>
<a href="<?php echo esc_url($item_url ?: '#'); ?>" class="<?php echo esc_attr($item_class); ?>"<?php echo $item_target; echo $style_attr; ?>>
<?php echo aksrt_icon_markup((string) $item_icon); // pre-escaped ?>
<?php if ($hover_html !== '') : ?>
<div class="hover-show-con"<?php echo $hover_width !== 200 ? ' style="min-width:' . (int) $hover_width . 'px"' : ''; ?>>
<div class="float-right__html"><?php echo wp_kses_post($hover_html); ?></div>
</div>
<?php endif; ?>
</a>
<?php endif; ?>
<?php endforeach;
// After loop: inject missing shop cart once. Never auto-inject pay_vip
// (admin may already add one; previous in-loop inject created duplicates).
?>
</div>
<?php endif; ?>
<?php if ($tabbar_enabled) :
$tabbar_use_single_extend = function_exists('aksrt_should_use_footer_tabbar_single_extend')
&& aksrt_should_use_footer_tabbar_single_extend();
?>
<div class="footer-tabbar-placeholder" aria-hidden="true"></div>
<nav id="footer-tabbar" class="footer-tabbar<?php echo !empty($tabbar_settings['animation']) ? ' has-animation' : ''; ?><?php echo !empty($tabbar_settings['scroll_down_hide']) ? ' scroll-down-hide' : ''; ?><?php echo empty($tabbar_settings['border']) ? ' no-border' : ''; ?><?php echo empty($tabbar_settings['shadow']) ? ' no-shadow' : ''; ?><?php echo $tabbar_use_single_extend ? ' footer-tabbar--single-extend' : ''; ?>" aria-label="<?php esc_attr_e('底部导航', 'aksrt'); ?>">
<?php if ($tabbar_use_single_extend && function_exists('aksrt_render_footer_tabbar_single_extend')) :
aksrt_render_footer_tabbar_single_extend(!empty($tabbar_settings['show_text']));
else :
foreach ($tabbar_items as $tab_item) :
$tab_type = sanitize_key((string) ($tab_item['type'] ?? 'custom'));
$tab_text = (string) ($tab_item['text'] ?? '');
$tab_icon = (string) ($tab_item['icon'] ?? 'fa fas fa-circle');
$tab_href = home_url('/');
if ($tab_type === 'category') {
$tab_href = get_post_type_archive_link('post') ?: home_url('/');
} elseif ($tab_type === 'auth') {
$tab_href = is_user_logged_in() ? aksrt_get_user_center_url() : aksrt_get_login_url();
} elseif ($tab_type === 'search') {
$tab_href = home_url('/');
} elseif ($tab_type === 'custom' && !empty($tab_item['link'])) {
$tab_href = (string) $tab_item['link'];
} elseif ($tab_type === 'home') {
$tab_href = home_url('/');
}
?>
<a href="<?php echo esc_url($tab_href); ?>" class="tabbar-item" data-type="<?php echo esc_attr($tab_type); ?>">
<?php echo aksrt_icon_markup((string) $tab_icon); // pre-escaped ?>
<?php if (!empty($tabbar_settings['show_text'])) : ?><span><?php echo esc_html($tab_text); ?></span><?php endif; ?>
</a>
<?php endforeach;
endif; ?>
</nav>
<?php endif; ?>
<?php
// 弹窗登录/注册模板(仅未登录用户)
if (
!is_user_logged_in()
&& class_exists('\AKSRT\Settings\Settings')
&& \AKSRT\Settings\Settings::user_sign_type() === 'modal'
&& file_exists(AKSRT_DIR . '/templates/parts/modal-auth.php')
) {
include AKSRT_DIR . '/templates/parts/modal-auth.php';
}
?>
<?php wp_footer(); ?>
</html>