You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1050 lines
36 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// 导入theme-options.php文件主题配置文件
require_once 'theme-options.php';
// 导入customizer.php文件自定义器配置文件
require_once get_template_directory() . '/inc/customizer.php';
// 导入assets-loader.php文件资源加载管理器
require_once get_template_directory() . '/inc/assets-loader.php';
// 添加自定义重写规则来处理archive页面分页
function add_archive_pagination_rules() {
// 添加/news/page/数字/的重写规则
add_rewrite_rule(
'^news/page/([0-9]+)/?$',
'index.php?pagename=archive&paged=$1',
'top'
);
// 添加/news/的重写规则
add_rewrite_rule(
'^news/?$',
'index.php?pagename=archive',
'top'
);
}
add_action('init', 'add_archive_pagination_rules');
// 刷新重写规则(仅在主题激活时执行一次)
function flush_archive_rewrite_rules() {
add_archive_pagination_rules();
flush_rewrite_rules();
}
register_activation_hook(__FILE__, 'flush_archive_rewrite_rules');
// 处理archive页面的查询
function handle_archive_query($query) {
if (!is_admin() && $query->is_main_query()) {
if (get_query_var('pagename') === 'archive') {
// 设置为archive页面查询
$query->set('post_type', 'post');
$query->set('post_status', 'publish');
$query->set('posts_per_page', 5);
// 获取分页参数
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$query->set('paged', $paged);
// 设置模板
add_filter('template_include', function($template) {
return get_template_directory() . '/archive.php';
});
}
}
}
add_action('pre_get_posts', 'handle_archive_query');
// 全局设置文章每页显示数量修复分页404问题
function set_posts_per_page_global($query) {
if (!is_admin() && $query->is_main_query()) {
if ($query->is_category() || $query->is_search() || $query->is_archive()) {
$query->set('posts_per_page', 5);
}
}
}
add_action('pre_get_posts', 'set_posts_per_page_global', 99);
// 维护模式检查
function check_maintenance_mode() {
// 如果是管理员或在后台,不显示维护页面
if (is_admin() || current_user_can('manage_options')) {
return;
}
// 获取维护模式设置
$options = get_option('themes_demo');
$maintenance_mode = isset($options['maintenance_mode']) ? $options['maintenance_mode'] : '0';
// 检查定时维护模式
$is_scheduled_maintenance = check_scheduled_maintenance();
// 如果启用了维护模式或处于定时维护期间,显示维护页面
if ($maintenance_mode === '1' || $is_scheduled_maintenance) {
$maintenance_title = isset($options['maintenance_title']) ? $options['maintenance_title'] : '网站维护中';
$maintenance_message = isset($options['maintenance_message']) ? $options['maintenance_message'] : '我们正在对网站进行维护升级,请稍后再访问。给您带来的不便,敬请谅解!';
// 设置503状态码
status_header(503);
// 显示维护页面
show_maintenance_page($maintenance_title, $maintenance_message);
exit;
}
}
add_action('template_redirect', 'check_maintenance_mode');
/**
* 检查是否处于定时维护期间
*/
function check_scheduled_maintenance() {
$options = get_option('themes_demo');
$start_time = isset($options['maintenance_start_time']) ? $options['maintenance_start_time'] : '';
$end_time = isset($options['maintenance_end_time']) ? $options['maintenance_end_time'] : '';
$timezone = isset($options['maintenance_timezone']) ? $options['maintenance_timezone'] : 'Asia/Shanghai';
// 如果没有设置时间返回false
if (empty($start_time) && empty($end_time)) {
return false;
}
try {
// 设置时区
$tz = new DateTimeZone($timezone);
$current_time = new DateTime('now', $tz);
// 如果只设置了结束时间,检查是否已过期
if (empty($start_time) && !empty($end_time)) {
$end_datetime = new DateTime($end_time, $tz);
return $current_time < $end_datetime;
}
// 如果只设置了开始时间,检查是否已开始
if (!empty($start_time) && empty($end_time)) {
$start_datetime = new DateTime($start_time, $tz);
return $current_time >= $start_datetime;
}
// 如果都设置了,检查是否在时间范围内
if (!empty($start_time) && !empty($end_time)) {
$start_datetime = new DateTime($start_time, $tz);
$end_datetime = new DateTime($end_time, $tz);
return $current_time >= $start_datetime && $current_time < $end_datetime;
}
} catch (Exception $e) {
// 时间解析错误,记录日志
error_log('Maintenance mode time parsing error: ' . $e->getMessage());
return false;
}
return false;
}
/**
* 获取维护模式结束时间(用于倒计时)
*/
function get_maintenance_end_time() {
$options = get_option('themes_demo');
$end_time = isset($options['maintenance_end_time']) ? $options['maintenance_end_time'] : '';
$timezone = isset($options['maintenance_timezone']) ? $options['maintenance_timezone'] : 'Asia/Shanghai';
if (empty($end_time)) {
return null;
}
try {
$tz = new DateTimeZone($timezone);
$end_datetime = new DateTime($end_time, $tz);
return $end_datetime->getTimestamp();
} catch (Exception $e) {
error_log('获取维护结束时间错误: ' . $e->getMessage());
return null;
}
}
/**
* 注册维护模式定时任务
*/
function schedule_maintenance_mode_tasks() {
// 清除现有的定时任务
wp_clear_scheduled_hook('maintenance_mode_start');
wp_clear_scheduled_hook('maintenance_mode_end');
$options = get_option('themes_demo');
$start_time = isset($options['maintenance_start_time']) ? $options['maintenance_start_time'] : '';
$end_time = isset($options['maintenance_end_time']) ? $options['maintenance_end_time'] : '';
$timezone = isset($options['maintenance_timezone']) ? $options['maintenance_timezone'] : 'Asia/Shanghai';
if (empty($start_time) && empty($end_time)) {
return;
}
try {
$tz = new DateTimeZone($timezone);
$current_time = new DateTime('now', $tz);
// 安排开始维护任务
if (!empty($start_time)) {
$start_datetime = new DateTime($start_time, $tz);
$start_timestamp = $start_datetime->getTimestamp();
// 只有当开始时间在未来时才安排任务
if ($start_timestamp > time()) {
wp_schedule_single_event($start_timestamp, 'maintenance_mode_start');
error_log('已安排维护模式开始任务: ' . $start_datetime->format('Y-m-d H:i:s'));
}
}
// 安排结束维护任务
if (!empty($end_time)) {
$end_datetime = new DateTime($end_time, $tz);
$end_timestamp = $end_datetime->getTimestamp();
// 只有当结束时间在未来时才安排任务
if ($end_timestamp > time()) {
wp_schedule_single_event($end_timestamp, 'maintenance_mode_end');
error_log('已安排维护模式结束任务: ' . $end_datetime->format('Y-m-d H:i:s'));
}
}
} catch (Exception $e) {
error_log('Schedule maintenance tasks error: ' . $e->getMessage());
}
}
add_action('update_option_themes_demo', 'schedule_maintenance_mode_tasks');
/**
* 获取主题缓存版本号
* 用于当文章更新时刷新所有相关的transient缓存
*/
function get_theme_cache_version() {
$version = get_option('theme_cache_version');
if (false === $version) {
$version = time();
update_option('theme_cache_version', $version);
}
return $version;
}
/**
* 更新主题缓存版本号(清理缓存)
*/
function update_theme_cache_version() {
update_option('theme_cache_version', time());
}
// 在文章保存、删除、切换主题时自动清理缓存
add_action('save_post', 'update_theme_cache_version');
add_action('deleted_post', 'update_theme_cache_version');
add_action('switch_theme', 'update_theme_cache_version');
/**
* 在顶部管理栏添加"清理缓存"按钮
*/
function add_clear_cache_button_to_admin_bar($wp_admin_bar) {
if (!current_user_can('manage_options')) {
return;
}
$args = array(
'id' => 'clear_theme_cache',
'title' => '清理主题缓存',
'href' => wp_nonce_url(admin_url('admin-post.php?action=clear_theme_cache'), 'clear_theme_cache_nonce'),
'meta' => array('class' => 'clear-theme-cache-button')
);
$wp_admin_bar->add_node($args);
}
add_action('admin_bar_menu', 'add_clear_cache_button_to_admin_bar', 999);
/**
* 处理手动清理缓存请求
*/
function handle_manual_cache_clearing() {
if (!current_user_can('manage_options')) {
wp_die('权限不足');
}
check_admin_referer('clear_theme_cache_nonce');
update_theme_cache_version();
// 获取来源页面,如果存在则跳回,否则跳回首页
$redirect_url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : home_url('/');
wp_redirect($redirect_url);
exit;
}
add_action('admin_post_clear_theme_cache', 'handle_manual_cache_clearing');
/**
* 自动开启维护模式
*/
function auto_start_maintenance_mode() {
$options = get_option('themes_demo');
$options['maintenance_mode'] = '1';
update_option('themes_demo', $options);
error_log('自动开启维护模式');
}
add_action('maintenance_mode_start', 'auto_start_maintenance_mode');
/**
* 自动关闭维护模式
*/
function auto_end_maintenance_mode() {
$options = get_option('themes_demo');
$options['maintenance_mode'] = '0';
update_option('themes_demo', $options);
error_log('自动关闭维护模式');
}
add_action('maintenance_mode_end', 'auto_end_maintenance_mode');
/**
* 当主题选项更新时重新安排维护任务
*/
function reschedule_maintenance_tasks_on_update($option_name, $old_value, $value) {
if ($option_name === 'themes_demo') {
// 检查维护相关设置是否有变化
$old_start = isset($old_value['maintenance_start_time']) ? $old_value['maintenance_start_time'] : '';
$old_end = isset($old_value['maintenance_end_time']) ? $old_value['maintenance_end_time'] : '';
$old_timezone = isset($old_value['maintenance_timezone']) ? $old_value['maintenance_timezone'] : 'Asia/Shanghai';
$new_start = isset($value['maintenance_start_time']) ? $value['maintenance_start_time'] : '';
$new_end = isset($value['maintenance_end_time']) ? $value['maintenance_end_time'] : '';
$new_timezone = isset($value['maintenance_timezone']) ? $value['maintenance_timezone'] : 'Asia/Shanghai';
if ($old_start !== $new_start || $old_end !== $new_end || $old_timezone !== $new_timezone) {
schedule_maintenance_mode_tasks();
error_log('维护模式设置已更新,重新安排定时任务');
}
}
}
add_action('updated_option', 'reschedule_maintenance_tasks_on_update', 10, 3);
/**
* 强制触发WordPress Cron用于测试
*/
function force_wp_cron() {
if (defined('DOING_CRON') && DOING_CRON) {
return;
}
// 触发WordPress Cron
spawn_cron();
}
// 在主题激活时安排维护任务
add_action('after_switch_theme', 'schedule_maintenance_mode_tasks');
// 包含维护模式测试文件(仅在开发环境或管理员访问时)
if (is_admin() && current_user_can('manage_options')) {
require_once get_template_directory() . '/maintenance-test.php';
}
// 显示维护页面
function show_maintenance_page($title, $message) {
$site_name = get_bloginfo('name');
$logo = get_theme_option('site_logo');
$end_timestamp = get_maintenance_end_time();
?><!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo('charset'); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?php echo esc_html($title); ?> - <?php echo esc_html($site_name); ?></title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
margin: 0;
padding: 0;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.maintenance-container {
background: white;
border-radius: 10px;
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
padding: 60px 40px;
text-align: center;
max-width: 500px;
margin: 20px;
}
.maintenance-logo {
max-width: 200px;
height: auto;
margin-bottom: 30px;
}
.maintenance-title {
color: #333;
font-size: 28px;
font-weight: 600;
margin-bottom: 20px;
}
.maintenance-message {
color: #666;
font-size: 16px;
line-height: 1.6;
margin-bottom: 30px;
}
.maintenance-icon {
font-size: 64px;
color: #667eea;
margin-bottom: 20px;
}
.countdown-container {
background: #f8f9fa;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
}
.countdown-title {
color: #333;
font-size: 18px;
font-weight: 600;
margin-bottom: 15px;
}
.countdown-timer {
display: flex;
justify-content: center;
gap: 15px;
margin-bottom: 15px;
}
.countdown-item {
background: #667eea;
color: white;
padding: 10px 15px;
border-radius: 5px;
min-width: 60px;
}
.countdown-number {
font-size: 24px;
font-weight: bold;
display: block;
}
.countdown-label {
font-size: 12px;
opacity: 0.9;
}
.back-link {
display: inline-block;
background: #667eea;
color: white;
padding: 12px 24px;
text-decoration: none;
border-radius: 5px;
transition: background 0.3s;
}
.back-link:hover {
background: #5a6fd8;
}
</style>
</head>
<body>
<div class="maintenance-container">
<?php if ($logo): ?>
<img src="<?php echo esc_url($logo); ?>" alt="<?php echo esc_attr($site_name); ?>" class="maintenance-logo">
<?php else: ?>
<div class="maintenance-icon">🔧</div>
<?php endif; ?>
<h1 class="maintenance-title"><?php echo esc_html($title); ?></h1>
<p class="maintenance-message"><?php echo esc_html($message); ?></p>
<?php if ($end_timestamp): ?>
<div class="countdown-container">
<div class="countdown-title">预计恢复时间</div>
<div class="countdown-timer" id="countdown">
<div class="countdown-item">
<span class="countdown-number" id="days">00</span>
<span class="countdown-label">天</span>
</div>
<div class="countdown-item">
<span class="countdown-number" id="hours">00</span>
<span class="countdown-label">时</span>
</div>
<div class="countdown-item">
<span class="countdown-number" id="minutes">00</span>
<span class="countdown-label">分</span>
</div>
<div class="countdown-item">
<span class="countdown-number" id="seconds">00</span>
<span class="countdown-label">秒</span>
</div>
</div>
</div>
<script>
function updateCountdown() {
const endTime = <?php echo $end_timestamp * 1000; ?>;
const now = new Date().getTime();
const distance = endTime - now;
if (distance < 0) {
document.getElementById('countdown').innerHTML = '<div style="color: #28a745; font-size: 18px; font-weight: bold;">维护已结束,正在刷新页面...</div>';
setTimeout(() => {
window.location.reload();
}, 2000);
return;
}
const days = Math.floor(distance / (1000 * 60 * 60 * 24));
const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((distance % (1000 * 60)) / 1000);
document.getElementById('days').textContent = String(days).padStart(2, '0');
document.getElementById('hours').textContent = String(hours).padStart(2, '0');
document.getElementById('minutes').textContent = String(minutes).padStart(2, '0');
document.getElementById('seconds').textContent = String(seconds).padStart(2, '0');
}
updateCountdown();
setInterval(updateCountdown, 1000);
</script>
<?php endif; ?>
<a href="<?php echo esc_url(home_url('/')); ?>" class="back-link">刷新页面</a>
</div>
</body>
</html><?php
}
// 导入资源加载管理器
require_once get_template_directory() . '/inc/assets-loader.php';
// 导入自定义器配置
require_once get_template_directory() . '/inc/customizer.php';
// 导入简码功能
require_once get_template_directory() . '/inc/shortcode.php';
// 主题支持功能
function nenghui_theme_setup() {
// 启用特色图像支持
add_theme_support('post-thumbnails');
// 设置特色图像尺寸
set_post_thumbnail_size(800, 600, true);
// 添加自定义图像尺寸
add_image_size('news-large', 800, 600, true);
add_image_size('news-medium', 400, 300, true);
add_image_size('news-small', 200, 150, true);
// 启用HTML5支持
add_theme_support('html5', array(
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption'
));
// 启用标题标签支持
add_theme_support('title-tag');
// 启用自定义logo支持
add_theme_support('custom-logo', array(
'height' => 100,
'width' => 400,
'flex-height' => true,
'flex-width' => true,
));
}
add_action('after_setup_theme', 'nenghui_theme_setup');
// 注册导航菜单
function register_theme_menus() {
register_nav_menus(array(
'primary-menu' => '主导航菜单'
));
}
add_action('init', 'register_theme_menus');
// 允许上传SVG和WebP格式文件
function allow_svg_webp_upload($mimes) {
// 添加SVG支持
$mimes['svg'] = 'image/svg+xml';
$mimes['svgz'] = 'image/svg+xml';
// 添加WebP支持
$mimes['webp'] = 'image/webp';
return $mimes;
}
add_filter('upload_mimes', 'allow_svg_webp_upload');
// 修复SVG文件的MIME类型检查
function fix_svg_mime_type($data, $file, $filename, $mimes) {
$filetype = wp_check_filetype($filename, $mimes);
if ($filetype['ext'] === 'svg') {
$data['ext'] = 'svg';
$data['type'] = 'image/svg+xml';
}
return $data;
}
add_filter('wp_check_filetype_and_ext', 'fix_svg_mime_type', 10, 4);
// 为SVG文件添加安全检查
function sanitize_svg_upload($file) {
if ($file['type'] === 'image/svg+xml') {
$svg_content = file_get_contents($file['tmp_name']);
// 检查是否包含潜在危险的标签
$dangerous_tags = array('script', 'object', 'embed', 'iframe', 'link');
foreach ($dangerous_tags as $tag) {
if (strpos($svg_content, '<' . $tag) !== false) {
$file['error'] = 'SVG文件包含不安全的内容上传被拒绝。';
return $file;
}
}
}
return $file;
}
add_filter('wp_handle_upload_prefilter', 'sanitize_svg_upload');
// 在媒体库中正确显示SVG文件
function display_svg_in_media_library($response, $attachment, $meta) {
if ($response['type'] === 'image' && $response['subtype'] === 'svg+xml') {
$response['image'] = array(
'src' => $response['url'],
'width' => 150,
'height' => 150,
);
$response['thumb'] = array(
'src' => $response['url'],
'width' => 150,
'height' => 150,
);
$response['sizes'] = array(
'full' => array(
'url' => $response['url'],
'width' => 150,
'height' => 150,
'orientation' => 'landscape'
)
);
}
return $response;
}
add_filter('wp_prepare_attachment_for_js', 'display_svg_in_media_library', 10, 3);
// 加载自定义器JavaScript文件
function nenghui_customizer_scripts() {
// 加载自定义器控制脚本
wp_enqueue_script(
'nenghui-customizer-controls',
get_template_directory_uri() . '/assets/js/customizer-controls.js',
array('jquery', 'customize-controls'),
'1.5.0',
true
);
}
add_action('customize_controls_enqueue_scripts', 'nenghui_customizer_scripts');
// 加载自定义器预览脚本
function nenghui_customizer_preview_scripts() {
wp_enqueue_script(
'nenghui-customizer-preview',
get_template_directory_uri() . '/assets/js/customizer-preview.js',
array('jquery', 'customize-preview'),
'1.5.0',
true
);
}
add_action('customize_preview_init', 'nenghui_customizer_preview_scripts');
// 禁用自动生成的图片尺寸
function shapeSpace_disable_image_sizes($sizes) {
unset($sizes['thumbnail']); // 禁用缩略图尺寸
unset($sizes['medium']); // 禁用中等尺寸
unset($sizes['large']); // 禁用大尺寸
unset($sizes['medium_large']); // 禁用中大型尺寸
unset($sizes['1536x1536']); // 禁用2倍中大型尺寸
unset($sizes['2048x2048']); // 禁用2倍大尺寸
return $sizes;
}
add_action('intermediate_image_sizes_advanced', 'shapeSpace_disable_image_sizes');
// 禁用大图片自动缩放功能
add_filter('big_image_size_threshold', '__return_false');
// 禁用其他自定义图片尺寸
function shapeSpace_disable_other_image_sizes() {
// 禁用特色图片尺寸
remove_image_size('post-thumbnail');
// 如果有其他主题或插件添加的图片尺寸,可以在这里继续移除
// 例如remove_image_size('custom-size');
}
add_action('init', 'shapeSpace_disable_other_image_sizes');
// 自定义导航菜单Walker类支持下拉多级菜单
class Custom_Walker_Nav_Menu extends Walker_Nav_Menu {
// 开始输出子菜单
function start_lvl(&$output, $depth = 0, $args = null) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class='sub-menu'>\n";
}
// 结束输出子菜单
function end_lvl(&$output, $depth = 0, $args = null) {
$indent = str_repeat("\t", $depth);
$output .= "$indent</ul>\n";
}
// 开始输出菜单项
function start_el(&$output, $item, $depth = 0, $args = null, $id = 0) {
$indent = ($depth) ? str_repeat("\t", $depth) : '';
$classes = empty($item->classes) ? array() : (array) $item->classes;
$classes[] = 'menu-item-' . $item->ID;
// 检查是否有子菜单
$has_children = in_array('menu-item-has-children', $classes);
$class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));
$class_names = $class_names ? ' class="' . esc_attr($class_names) . '"' : '';
$id = apply_filters('nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args);
$id = $id ? ' id="' . esc_attr($id) . '"' : '';
$output .= $indent . '<li' . $id . $class_names .'>';
$attributes = ! empty($item->attr_title) ? ' title="' . esc_attr($item->attr_title) .'"' : '';
$attributes .= ! empty($item->target) ? ' target="' . esc_attr($item->target ) .'"' : '';
$attributes .= ! empty($item->xfn) ? ' rel="' . esc_attr($item->xfn ) .'"' : '';
$attributes .= ! empty($item->url) ? ' href="' . esc_attr($item->url ) .'"' : '';
$item_output = isset($args->before) ? $args->before : '';
$item_output .= '<a' . $attributes . '>';
$item_output .= (isset($args->link_before) ? $args->link_before : '') . apply_filters('the_title', $item->title, $item->ID) . (isset($args->link_after) ? $args->link_after : '');
$item_output .= '</a>';
$item_output .= isset($args->after) ? $args->after : '';
$output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
}
// 结束输出菜单项
function end_el(&$output, $item, $depth = 0, $args = null) {
$output .= "</li>\n";
}
}
// 添加菜单JavaScript支持
function enqueue_dropdown_menu_scripts() {
wp_enqueue_script(
'dropdown-menu',
get_template_directory_uri() . '/assets/js/dropdown-menu.js',
array('jquery'),
'1.0.0',
true
);
}
add_action('wp_enqueue_scripts', 'enqueue_dropdown_menu_scripts');
// 股票信息短代码函数
function nenghui_stock_info_shortcode($atts) {
$attributes = shortcode_atts(array(
'stock_code' => 'sz301046',
'theme' => 'default',
'show_chart' => false,
'block_id' => 'stock-info-' . uniqid()
), $atts);
// 开始输出缓冲
ob_start();
// 设置属性数组供模板使用
$template_attributes = array(
'stockCode' => $attributes['stock_code'],
'theme' => $attributes['theme'],
'showChart' => $attributes['show_chart'],
'blockId' => $attributes['block_id']
);
// 包含股票信息区块模板
$template_path = get_template_directory() . '/template-parts/block/block-stock-info.php';
if (file_exists($template_path)) {
// 将属性设置为全局变量供模板使用
global $stock_info_attributes;
$stock_info_attributes = $template_attributes;
include $template_path;
} else {
echo '<div class="error">股票信息模板文件未找到</div>';
}
return ob_get_clean();
}
// 注册短代码
add_shortcode('nenghui_stock_info', 'nenghui_stock_info_shortcode');
// 投资者接待短代码函数
function nenghui_investor_reception_shortcode($atts) {
$attributes = shortcode_atts(array(
'title' => '投资者接待',
'subtitle' => '投资者交流平台',
'contact_person' => '董事会秘书 罗联明',
'contact_phone' => '021-50896255',
'contact_email' => 'nenghui@nhet.com.cn',
'background_image' => 'http://nh.matepress.cn/wp-content/uploads/2025/09/touzizhe-banner.webp',
'theme' => 'default',
'block_id' => 'investor-reception-' . uniqid()
), $atts);
// 开始输出缓冲
ob_start();
// 设置属性数组供模板使用
$template_attributes = array(
'title' => $attributes['title'],
'subtitle' => $attributes['subtitle'],
'contactPerson' => $attributes['contact_person'],
'contactPhone' => $attributes['contact_phone'],
'contactEmail' => $attributes['contact_email'],
'backgroundImage' => $attributes['background_image'],
'theme' => $attributes['theme'],
'blockId' => $attributes['block_id']
);
// 包含投资者接待区块模板
$template_path = get_template_directory() . '/template-parts/block/block-investor-reception.php';
if (file_exists($template_path)) {
// 将属性设置为全局变量供模板使用
global $investor_reception_attributes;
$investor_reception_attributes = $template_attributes;
include $template_path;
} else {
echo '<div class="error">投资者接待模板文件未找到</div>';
}
return ob_get_clean();
}
// 注册投资者接待短代码
add_shortcode('nenghui_investor_reception', 'nenghui_investor_reception_shortcode');
// 高管简历短代码函数
function nenghui_executive_profiles_shortcode($atts) {
$attributes = shortcode_atts(array(
'title' => '高管团队',
'theme' => 'default',
'columns' => '1',
'block_id' => 'executive-profiles-' . uniqid()
), $atts);
// 开始输出缓冲
ob_start();
// 设置属性数组供模板使用
$template_attributes = array(
'title' => $attributes['title'],
'theme' => $attributes['theme'],
'columns' => intval($attributes['columns']),
'blockId' => $attributes['block_id']
);
// 包含高管简历区块模板
$template_path = get_template_directory() . '/template-parts/block/block-executive-profiles.php';
if (file_exists($template_path)) {
// 将属性设置为全局变量供模板使用
global $executive_profiles_attributes;
$executive_profiles_attributes = $template_attributes;
include $template_path;
} else {
echo '<div class="error">高管简历模板文件未找到</div>';
}
return ob_get_clean();
}
// 注册高管简历短代码
add_shortcode('nenghui_executive_profiles', 'nenghui_executive_profiles_shortcode');
// HTML压缩功能集成
// 引入HTML压缩集成文件
require_once get_template_directory() . '/inc/html-compression-integration.php';
/**
* 初始化HTML压缩功能
* 在主题激活时设置默认选项
*/
function nenghui_init_html_compression() {
// 设置默认的压缩选项
$default_options = array(
'nenghui_compression_enabled' => true,
'nenghui_compression_remove_comments' => true,
'nenghui_compression_remove_whitespace' => true,
'nenghui_compression_compress_css' => true,
'nenghui_compression_compress_js' => true,
'nenghui_compression_preserve_line_breaks' => false,
'nenghui_compression_excluded_pages' => 'wp-admin,wp-login,xmlrpc'
);
// 只在首次激活时设置默认值
foreach ($default_options as $option_name => $default_value) {
if (get_theme_mod($option_name) === false) {
set_theme_mod($option_name, $default_value);
}
}
}
// 在主题激活时初始化压缩功能
add_action('after_switch_theme', 'nenghui_init_html_compression');
/**
* 添加HTML压缩相关的管理员通知
*/
function nenghui_compression_admin_notices() {
// 检查是否启用了压缩功能
$compression_enabled = get_theme_mod('nenghui_compression_enabled', true);
if (!$compression_enabled) {
echo '<div class="notice notice-warning is-dismissible">';
echo '<p><strong>能汇能源主题:</strong>HTML压缩功能已禁用。您可以在 <a href="' . admin_url('customize.php?autofocus[section]=nenghui_compression_settings') . '">自定义器</a> 中启用它以提升网站性能。</p>';
echo '</div>';
}
}
add_action('admin_notices', 'nenghui_compression_admin_notices');
/**
* 添加压缩功能到主题支持
*/
function nenghui_add_compression_theme_support() {
// 添加主题支持HTML压缩
add_theme_support('nenghui-html-compression', array(
'remove_comments' => true,
'remove_whitespace' => true,
'compress_css' => true,
'compress_js' => true,
'preserve_content' => array('pre', 'textarea', 'script', 'style'),
'excluded_pages' => array('wp-admin', 'wp-login', 'xmlrpc')
));
}
add_action('after_setup_theme', 'nenghui_add_compression_theme_support');
/**
* 清理主题停用时的压缩相关数据
*/
function nenghui_cleanup_compression_data() {
// 清理压缩统计数据
delete_option('nenghui_compression_stats');
// 清理自定义器设置(可选,根据需要决定是否保留用户设置)
// remove_theme_mod('nenghui_compression_enabled');
// remove_theme_mod('nenghui_compression_remove_comments');
// remove_theme_mod('nenghui_compression_remove_whitespace');
// remove_theme_mod('nenghui_compression_compress_css');
// remove_theme_mod('nenghui_compression_compress_js');
// remove_theme_mod('nenghui_compression_excluded_pages');
}
add_action('switch_theme', 'nenghui_cleanup_compression_data');
/**
* 手机轮播图简码功能
* 使用方法: [phone_carousel]
*/
function phone_carousel_shortcode($atts) {
// 设置默认属性
$atts = shortcode_atts(array(
'width' => '220px',
'height' => '800px',
'mobile_width' => '300px',
'mobile_height' => '600px'
), $atts, 'phone_carousel');
// 开始输出缓冲
ob_start();
// 包含轮播图模板
include get_template_directory() . '/template-parts/block/block-phone-carousel.php';
// 获取缓冲内容并清理缓冲区
$output = ob_get_clean();
return $output;
}
add_shortcode('phone_carousel', 'phone_carousel_shortcode');
/**
* 为手机轮播图简码添加自定义CSS样式
*/
function phone_carousel_shortcode_styles() {
// 只在使用了简码的页面加载样式
global $post;
if (is_a($post, 'WP_Post') && has_shortcode($post->post_content, 'phone_carousel')) {
// 样式已经包含在模板文件中,这里可以添加额外的样式覆盖
echo '<style>
.phone-carousel-wrapper {
display: flex;
justify-content: center;
align-items: center;
min-height: 400px;
padding: 20px;
}
</style>';
}
}
add_action('wp_head', 'phone_carousel_shortcode_styles');
/**
* 修复 Elementor Google Fonts 的 Mixed Content 错误
* 强制所有外部资源使用 HTTPS
*/
function fix_elementor_google_fonts_mixed_content() {
// 修复 Google Fonts 的 HTTP 链接
add_filter('elementor/frontend/print_google_fonts', function($google_fonts_url) {
if (is_ssl() && strpos($google_fonts_url, 'http://') === 0) {
return str_replace('http://', 'https://', $google_fonts_url);
}
return $google_fonts_url;
});
// 修复所有样式表的 HTTP 链接
add_filter('style_loader_src', function($src) {
if (is_ssl() && strpos($src, 'http://') === 0) {
return str_replace('http://', 'https://', $src);
}
return $src;
});
// 修复所有脚本的 HTTP 链接
add_filter('script_loader_src', function($src) {
if (is_ssl() && strpos($src, 'http://') === 0) {
return str_replace('http://', 'https://', $src);
}
return $src;
});
}
add_action('init', 'fix_elementor_google_fonts_mixed_content');
/**
* 禁用 Elementor 的 Google Fonts可选方案
* 如果上面的修复不起作用,可以取消注释下面的代码来完全禁用 Google Fonts
*/
/*
function disable_elementor_google_fonts() {
// 禁用 Elementor 的 Google Fonts
add_filter('elementor/frontend/print_google_fonts', '__return_false');
// 移除 Google Fonts 样式表
add_action('wp_enqueue_scripts', function() {
wp_dequeue_style('google-fonts');
wp_deregister_style('google-fonts');
}, 20);
}
add_action('init', 'disable_elementor_google_fonts');
*/
?>