首页 / 漳州柔性供应链 / WordPress二次开发构建在线咨询预约系统实战

WordPress二次开发构建在线咨询预约系统实战

本文详细介绍了如何通过WordPress二次开发构建功能完善的在线咨询预约系统。首先进行需求分析,明确用户预约、管理后台、日历集成及通知等核心模块。接着搭建开发环境,选用ACF插件、FullCalendar日历组件等技术工具,设计数据库并创建自定义文章类型。随后分别实现前端预约界面、后端逻辑处理、管理功能增强及邮件通知系统。最后强调系统测试、性能优化与安全加固,并建议扩展支付集成、客户账户等高级功能,助力服务型企业提升运营效率与客户体验。

WordPress二次开发构建在线咨询预约系统实战

在数字化浪潮席卷各行各业的今天,一个高效、便捷的在线咨询预约系统已成为许多服务型企业和专业人士的刚需。无论是医疗诊所、法律事务所、教育机构还是个人咨询师,都需要一套能够自动化管理预约流程的系统。本文将详细介绍如何通过WordPress二次开发,构建一个功能完善、稳定可靠的在线咨询预约系统。

一、系统需求分析与规划

在开始开发之前,我们需要明确系统的核心需求:

  1. 用户端功能:客户可以查看可预约时间段、选择服务类型、填写基本信息、提交预约请求
  2. 管理端功能:管理员可以设置服务项目、管理预约时间、查看预约详情、处理预约状态
  3. 通知系统:自动向客户和管理员发送预约确认、提醒和变更通知
  4. 日历集成:直观展示可预约时间段,避免时间冲突
  5. 支付集成(可选):支持预约定金或全款支付

基于这些需求,我们将系统分为以下几个模块:用户预约模块、管理后台模块、日历显示模块和通知模块。

二、开发环境搭建与技术选型

1. 基础环境准备

首先确保你的WordPress网站已经安装并运行正常。建议使用最新版本的WordPress,并选择一款轻量级、响应式的主题作为基础。

2. 必要插件准备

虽然我们的目标是自定义开发,但一些基础插件可以大大提高开发效率:

  • Advanced Custom Fields (ACF):用于创建自定义字段
  • 缓存插件:如WP Rocket,提升网站性能
  • 安全插件:如Wordfence,增强系统安全性

3. 技术方案选择

  • 前端:主要使用HTML5、CSS3、JavaScript(配合jQuery)
  • 后端:PHP 7.4+,利用WordPress钩子函数和自定义文章类型
  • 数据库:MySQL,使用WordPress数据库API进行操作
  • 日历组件:FullCalendar.js(开源JavaScript日历库)
  • 通知服务:使用WP Mail SMTP插件配置邮件发送,或集成第三方短信API

三、数据库设计与自定义文章类型创建

1. 创建自定义文章类型

在主题的functions.php文件中添加以下代码,创建“预约”和“服务”两种自定义文章类型:

// 创建服务自定义文章类型
function create_service_post_type() {
    register_post_type('service',
        array(
            'labels' => array(
                'name' => __('服务项目'),
                'singular_name' => __('服务项目')
            ),
            'public' => true,
            'has_archive' => true,
            'menu_icon' => 'dashicons-calendar-alt',
            'supports' => array('title', 'editor', 'thumbnail')
        )
    );
}
add_action('init', 'create_service_post_type');

// 创建预约自定义文章类型
function create_appointment_post_type() {
    register_post_type('appointment',
        array(
            'labels' => array(
                'name' => __('预约'),
                'singular_name' => __('预约')
            ),
            'public' => false,
            'show_ui' => true,
            'has_archive' => false,
            'menu_icon' => 'dashicons-clock',
            'supports' => array('title')
        )
    );
}
add_action('init', 'create_appointment_post_type');

2. 使用ACF创建自定义字段

通过ACF插件为“预约”文章类型添加以下字段组:

  • 客户姓名(文本)
  • 客户邮箱(邮箱)
  • 客户电话(文本)
  • 预约服务(关联到服务文章类型)
  • 预约日期(日期选择器)
  • 预约时间(选择框)
  • 预约状态(选择框:待确认、已确认、已完成、已取消)
  • 备注(文本区域)

四、前端预约界面开发

1. 创建预约短代码

在functions.php中添加短代码函数,方便在任何页面插入预约表单:

function appointment_booking_shortcode() {
    ob_start();
    ?>
    <div id="appointment-booking-system">
        <!-- 这里将放置预约界面 -->
    </div>
    <?php
    return ob_get_clean();
}
add_shortcode('appointment_booking', 'appointment_booking_shortcode');

2. 构建多步骤预约表单

使用HTML、CSS和JavaScript创建一个用户友好的多步骤表单:

<div class="appointment-steps">
    <div class="step active" data-step="1">
        <h3>选择服务</h3>
        <div class="service-list">
            <!-- 动态加载服务选项 -->
        </div>
    </div>
    
    <div class="step" data-step="2">
        <h3>选择时间</h3>
        <div id="booking-calendar"></div>
    </div>
    
    <div class="step" data-step="3">
        <h3>填写信息</h3>
        <form id="appointment-form">
            <input type="text" name="client_name" placeholder="您的姓名" required>
            <input type="email" name="client_email" placeholder="电子邮箱" required>
            <input type="tel" name="client_phone" placeholder="联系电话" required>
            <textarea name="notes" placeholder="备注信息"></textarea>
            <button type="submit">提交预约</button>
        </form>
    </div>
    
    <div class="step" data-step="4">
        <h3>预约成功</h3>
        <div class="confirmation-message">
            <p>您的预约已提交成功!</p>
            <p>我们已向您的邮箱发送确认信息。</p>
        </div>
    </div>
</div>

3. 集成FullCalendar日历

在页面中引入FullCalendar库,并配置可预约时间:

document.addEventListener('DOMContentLoaded', function() {
    var calendarEl = document.getElementById('booking-calendar');
    var calendar = new FullCalendar.Calendar(calendarEl, {
        initialView: 'timeGridWeek',
        slotMinTime: '09:00:00',
        slotMaxTime: '18:00:00',
        events: '/wp-json/appointment/v1/available-slots',
        dateClick: function(info) {
            // 处理日期选择
            selectAppointmentTime(info.dateStr);
        }
    });
    calendar.render();
});

五、后端逻辑与数据处理

1. 创建REST API端点

为前端提供可预约时间段数据:

// 注册REST API路由
add_action('rest_api_init', function() {
    register_rest_route('appointment/v1', '/available-slots', array(
        'methods' => 'GET',
        'callback' => 'get_available_slots',
        'permission_callback' => '__return_true'
    ));
    
    register_rest_route('appointment/v1', '/book-appointment', array(
        'methods' => 'POST',
        'callback' => 'book_appointment',
        'permission_callback' => '__return_true'
    ));
});

// 获取可预约时间段
function get_available_slots($request) {
    $date = $request->get_param('date');
    // 查询数据库,排除已被预约的时间
    // 返回可用时间段数组
}

// 处理预约提交
function book_appointment($request) {
    $data = $request->get_params();
    
    // 验证数据
    if(empty($data['client_name']) || empty($data['client_email'])) {
        return new WP_Error('validation_error', '请填写完整信息', array('status' => 400));
    }
    
    // 创建预约记录
    $appointment_id = wp_insert_post(array(
        'post_title' => $data['client_name'] . '的预约',
        'post_type' => 'appointment',
        'post_status' => 'publish'
    ));
    
    // 保存自定义字段
    update_field('client_name', $data['client_name'], $appointment_id);
    update_field('client_email', $data['client_email'], $appointment_id);
    update_field('appointment_date', $data['appointment_date'], $appointment_id);
    update_field('appointment_status', 'pending', $appointment_id);
    
    // 发送确认邮件
    send_confirmation_email($data);
    
    return array(
        'success' => true,
        'appointment_id' => $appointment_id
    );
}

2. 时间冲突检测

确保同一时间段不会被重复预约:

function is_time_slot_available($date, $time) {
    $args = array(
        'post_type' => 'appointment',
        'posts_per_page' => -1,
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'appointment_date',
                'value' => $date,
                'compare' => '='
            ),
            array(
                'key' => 'appointment_time',
                'value' => $time,
                'compare' => '='
            ),
            array(
                'key' => 'appointment_status',
                'value' => array('pending', 'confirmed'),
                'compare' => 'IN'
            )
        )
    );
    
    $existing_appointments = new WP_Query($args);
    return $existing_appointments->post_count == 0;
}

六、管理后台功能增强

1. 创建预约管理页面

在WordPress后台添加自定义管理页面,集中显示所有预约:

add_action('admin_menu', 'add_appointment_admin_page');
function add_appointment_admin_page() {
    add_menu_page(
        '预约管理',
        '预约管理',
        'manage_options',
        'appointment-manager',
        'render_appointment_admin_page',
        'dashicons-calendar',
        30
    );
}

function render_appointment_admin_page() {
    // 显示预约列表,包括筛选和搜索功能
    // 添加批量操作:确认、取消、删除
}

2. 添加预约日历视图

在管理后台集成日历视图,直观展示每日预约情况:

// 在管理页面添加FullCalendar
function enqueue_admin_calendar() {
    $screen = get_current_screen();
    if($screen->id == 'toplevel_page_appointment-manager') {
        wp_enqueue_script('fullcalendar-admin', 'https://cdn.jsdelivr.net/npm/fullcalendar@5.10.1/main.min.js');
        wp_enqueue_style('fullcalendar-admin-css', 'https://cdn.jsdelivr.net/npm/fullcalendar@5.10.1/main.min.css');
    }
}
add_action('admin_enqueue_scripts', 'enqueue_admin_calendar');

七、通知系统实现

1. 邮件通知配置

使用WordPress邮件函数发送通知:

function send_confirmation_email($appointment_data) {
    $to = $appointment_data['client_email'];
    $subject = '您的预约已确认';
    $message = "尊敬的" . $appointment_data['client_name'] . ":nn";
    $message .= "您的预约已成功提交,详情如下:n";
    $message .= "预约时间:" . $appointment_data['appointment_date'] . " " . $appointment_data['appointment_time'] . "n";
    $message .= "如有变动,请及时联系我们。nn";
    $message .= "感谢您的预约!";
    
    wp_mail($to, $subject, $message);
    
    // 同时发送通知给管理员
    $admin_email = get_option('admin_email');
    wp_mail($admin_email, '新预约通知', '您有一个新的预约请求,请及时处理。');
}

2. 预约提醒功能

设置定时任务,在预约前一天发送提醒:

// 创建定时任务
if (!wp_next_scheduled('send_appointment_reminders')) {
    wp_schedule_event(time(), 'daily', 'send_appointment_reminders');
}

add_action('send_appointment_reminders', 'send_daily_reminders');
function send_daily_reminders() {
    // 查询明天所有的预约
    $tomorrow = date('Y-m-d', strtotime('+1 day'));
    
    $args = array(
        'post_type' => 'appointment',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => 'appointment_date',
                'value' => $tomorrow,
                'compare' => '='
            ),
            array(
                'key' => 'appointment_status',
                'value' => 'confirmed',
                'compare' => '='
            )
        )
    );
    
    $appointments = new WP_Query($args);
    
    while($appointments->have_posts()) {
        $appointments->the_post();
        $appointment_id = get_the_ID();
        $client_email = get_field('client_email', $appointment_id);
        $client_name = get_field('client_name', $appointment_id);
        $appointment_time = get_field('appointment_time', $appointment_id);
        
        // 发送提醒邮件
        $subject = '预约提醒:您明天的预约';
        $message = "尊敬的" . $client_name . ":nn";
        $message .= "提醒您明天" . $appointment_time . "有预约。n";
        $message .= "请准时参加,如有变动请及时联系我们。";
        
        wp_mail($client_email, $subject, $message);
    }
}

八、系统测试与优化

1. 功能测试

  • 测试预约流程的完整性
  • 验证时间冲突检测的准确性
  • 检查邮件通知的送达情况
  • 测试管理后台的各项操作

2. 性能优化

  • 对数据库查询进行缓存优化
  • 使用AJAX加载日历数据,提高响应速度
  • 压缩前端资源文件
  • 对高并发场景进行压力测试

3. 安全加固

  • 对所有用户输入进行验证和清理
  • 使用nonce防止CSRF攻击
  • 限制API访问频率
  • 定期备份预约数据

九、扩展功能建议

当基础系统运行稳定后,可以考虑添加以下扩展功能:

  1. 在线支付集成:支持微信支付、支付宝等支付方式
  2. 客户账户系统:允许客户注册账户,查看预约历史
  3. 评价系统:预约完成后邀请客户评价服务
  4. 多服务商支持:适用于有多位咨询师或医生的机构
  5. 移动端应用:开发配套的移动应用,方便随时管理预约
  6. 数据分析仪表盘:统计预约数据,分析业务趋势

结语

通过WordPress二次开发构建在线咨询预约系统,既可以利用WordPress成熟的内容管理框架,又能根据具体业务需求进行深度定制。本文介绍的方法和代码示例提供了一个完整的开发路径,从需求分析到功能实现,涵盖了系统开发的主要环节。

值得注意的是,每个业务场景都有其特殊性,在实际开发过程中需要根据具体需求进行调整和优化。建议在开发初期就充分考虑系统的扩展性,以便未来能够轻松添加新功能。

在线预约系统的价值不仅在于自动化流程、减少人工错误,更重要的是提升客户体验,展现专业形象。一个稳定、易用的预约系统将成为您业务发展的重要助力。

最后,记得在系统上线后持续收集用户反馈,不断迭代优化,使系统更好地服务于您的业务需求。祝您开发顺利!

十、用户界面优化与交互体验提升

1. 响应式设计与移动端适配

确保预约系统在各种设备上都能完美显示:

/* 移动端优先的响应式设计 */
.appointment-container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 20px;
}

@media (max-width: 768px) {
    .appointment-steps {
        flex-direction: column;
    }
    
    .step {
        width: 100% !important;
        margin-bottom: 20px;
    }
    
    #booking-calendar .fc-toolbar {
        flex-direction: column;
    }
    
    .fc-toolbar-chunk {
        margin-bottom: 10px;
    }
}

/* 触摸友好的交互元素 */
.booking-button, .time-slot {
    min-height: 44px; /* 苹果推荐的最小触摸尺寸 */
    padding: 12px 24px;
    font-size: 16px; /* 防止iOS缩放 */
}

.time-slot:hover, .time-slot:active {
    transform: scale(1.05);
    transition: transform 0.2s ease;
}

2. 实时验证与反馈机制

在用户填写表单时提供即时验证:

// 实时表单验证
function setupRealTimeValidation() {
    const form = document.getElementById('appointment-form');
    const inputs = form.querySelectorAll('input[required], select[required]');
    
    inputs.forEach(input => {
        input.addEventListener('blur', function() {
            validateField(this);
        });
        
        input.addEventListener('input', function() {
            clearFieldError(this);
        });
    });
}

function validateField(field) {
    const value = field.value.trim();
    const errorElement = document.getElementById(`${field.name}-error`);
    
    if (!value) {
        showFieldError(field, '此字段为必填项');
        return false;
    }
    
    if (field.type === 'email' && !isValidEmail(value)) {
        showFieldError(field, '请输入有效的邮箱地址');
        return false;
    }
    
    if (field.name === 'client_phone' && !isValidPhone(value)) {
        showFieldError(field, '请输入有效的电话号码');
        return false;
    }
    
    return true;
}

function showFieldError(field, message) {
    field.classList.add('error');
    
    let errorElement = document.getElementById(`${field.name}-error`);
    if (!errorElement) {
        errorElement = document.createElement('div');
        errorElement.id = `${field.name}-error`;
        errorElement.className = 'field-error';
        field.parentNode.appendChild(errorElement);
    }
    
    errorElement.textContent = message;
}

十一、高级功能实现

1. 预约规则与限制设置

为不同类型的服务设置不同的预约规则:

class AppointmentRules {
    private $service_id;
    
    public function __construct($service_id) {
        $this->service_id = $service_id;
    }
    
    // 获取服务的最短预约提前时间
    public function get_min_advance_time() {
        $min_advance = get_field('min_advance_booking', $this->service_id);
        return $min_advance ?: 2; // 默认2小时
    }
    
    // 获取服务的最长预约提前时间
    public function get_max_advance_time() {
        $max_advance = get_field('max_advance_booking', $this->service_id);
        return $max_advance ?: 30; // 默认30天
    }
    
    // 检查是否允许预约
    public function is_booking_allowed($date, $time) {
        $datetime = strtotime("$date $time");
        $current_time = current_time('timestamp');
        
        // 检查是否在允许的时间范围内
        $min_advance_hours = $this->get_min_advance_time();
        $max_advance_days = $this->get_max_advance_time();
        
        $min_time = $current_time + ($min_advance_hours * HOUR_IN_SECONDS);
        $max_time = $current_time + ($max_advance_days * DAY_IN_SECONDS);
        
        if ($datetime < $min_time) {
            return array(
                'allowed' => false,
                'message' => "需要至少提前{$min_advance_hours}小时预约"
            );
        }
        
        if ($datetime > $max_time) {
            return array(
                'allowed' => false,
                'message' => "最多只能提前{$max_advance_days}天预约"
            );
        }
        
        // 检查节假日
        if ($this->is_holiday($date)) {
            return array(
                'allowed' => false,
                'message' => "该日期为节假日,不可预约"
            );
        }
        
        return array('allowed' => true);
    }
    
    // 节假日检查
    private function is_holiday($date) {
        $holidays = get_field('holidays', 'option');
        if (!$holidays) return false;
        
        foreach ($holidays as $holiday) {
            if ($holiday['date'] == $date) {
                return true;
            }
        }
        
        return false;
    }
}

2. 智能时间分配与冲突避免

class TimeSlotManager {
    // 获取可用的时间槽
    public function get_available_slots($service_id, $date) {
        $service_duration = get_field('service_duration', $service_id);
        $working_hours = $this->get_working_hours($date);
        $existing_appointments = $this->get_existing_appointments($date);
        
        $available_slots = array();
        
        foreach ($working_hours as $time_range) {
            $slots = $this->generate_time_slots(
                $time_range['start'],
                $time_range['end'],
                $service_duration
            );
            
            foreach ($slots as $slot) {
                if (!$this->is_slot_conflicted($slot, $existing_appointments, $service_duration)) {
                    $available_slots[] = $slot;
                }
            }
        }
        
        return $available_slots;
    }
    
    // 生成时间槽
    private function generate_time_slots($start_time, $end_time, $duration) {
        $slots = array();
        $current = strtotime($start_time);
        $end = strtotime($end_time);
        
        while ($current + ($duration * 60) <= $end) {
            $slot_end = $current + ($duration * 60);
            $slots[] = array(
                'start' => date('H:i', $current),
                'end' => date('H:i', $slot_end)
            );
            $current = $slot_end;
        }
        
        return $slots;
    }
    
    // 检查时间冲突
    private function is_slot_conflicted($slot, $existing_appointments, $duration) {
        $slot_start = strtotime($slot['start']);
        $slot_end = strtotime($slot['end']);
        
        foreach ($existing_appointments as $appointment) {
            $app_start = strtotime($appointment['time']);
            $app_end = $app_start + ($appointment['duration'] * 60);
            
            // 检查时间重叠
            if ($slot_start < $app_end && $slot_end > $app_start) {
                return true;
            }
        }
        
        return false;
    }
}

十二、数据统计与分析功能

1. 预约数据统计仪表盘

class AppointmentAnalytics {
    // 获取月度统计数据
    public function get_monthly_stats($month, $year) {
        global $wpdb;
        
        $start_date = "$year-$month-01";
        $end_date = date('Y-m-t', strtotime($start_date));
        
        $stats = array(
            'total_appointments' => 0,
            'confirmed_appointments' => 0,
            'cancelled_appointments' => 0,
            'revenue' => 0,
            'popular_services' => array(),
            'peak_hours' => array()
        );
        
        // 获取总预约数
        $query = $wpdb->prepare("
            SELECT COUNT(*) as count, 
                   appointment_status.meta_value as status
            FROM {$wpdb->posts} p
            LEFT JOIN {$wpdb->postmeta} appointment_date 
                ON p.ID = appointment_date.post_id 
                AND appointment_date.meta_key = 'appointment_date'
            LEFT JOIN {$wpdb->postmeta} appointment_status 
                ON p.ID = appointment_status.post_id 
                AND appointment_status.meta_key = 'appointment_status'
            WHERE p.post_type = 'appointment'
                AND p.post_status = 'publish'
                AND appointment_date.meta_value BETWEEN %s AND %s
            GROUP BY appointment_status.meta_value
        ", $start_date, $end_date);
        
        $results = $wpdb->get_results($query);
        
        foreach ($results as $row) {
            $stats['total_appointments'] += $row->count;
            
            if ($row->status == 'confirmed') {
                $stats['confirmed_appointments'] = $row->count;
            } elseif ($row->status == 'cancelled') {
                $stats['cancelled_appointments'] = $row->count;
            }
        }
        
        return $stats;
    }
    
    // 生成预约趋势图表数据
    public function get_trend_data($period = 'monthly') {
        $data = array();
        $current_date = new DateTime();
        
        for ($i = 11; $i >= 0; $i--) {
            if ($period == 'monthly') {
                $date = clone $current_date;
                $date->modify("-$i months");
                $label = $date->format('Y-m');
                $stats = $this->get_monthly_stats(
                    $date->format('m'),
                    $date->format('Y')
                );
            } else {
                // 周度数据
                $date = clone $current_date;
                $date->modify("-$i weeks");
                $label = $date->format('Y-W');
                $stats = $this->get_weekly_stats($date);
            }
            
            $data[] = array(
                'label' => $label,
                'total' => $stats['total_appointments'],
                'confirmed' => $stats['confirmed_appointments'],
                'cancelled' => $stats['cancelled_appointments']
            );
        }
        
        return $data;
    }
}

2. 预约效率分析

class EfficiencyAnalyzer {
    // 计算预约到店率
    public function calculate_show_up_rate($start_date, $end_date) {
        $total_confirmed = $this->count_appointments_by_status(
            'confirmed', 
            $start_date, 
            $end_date
        );
        
        $total_completed = $this->count_appointments_by_status(
            'completed', 
            $start_date, 
            $end_date
        );
        
        if ($total_confirmed > 0) {
            return round(($total_completed / $total_confirmed) * 100, 2);
        }
        
        return 0;
    }
    
    // 计算平均预约提前时间
    public function calculate_average_lead_time($start_date, $end_date) {
        global $wpdb;
        
        $query = $wpdb->prepare("
            SELECT AVG(TIMESTAMPDIFF(HOUR, 
                STR_TO_DATE(CONCAT(appointment_date.meta_value, ' ', appointment_time.meta_value), '%%Y-%%m-%%d %%H:%%i'),
                created.post_date
            )) as avg_lead_time
            FROM {$wpdb->posts} p
            LEFT JOIN {$wpdb->postmeta} appointment_date 
                ON p.ID = appointment_date.post_id 
                AND appointment_date.meta_key = 'appointment_date'
            LEFT JOIN {$wpdb->postmeta} appointment_time 
                ON p.ID = appointment_time.post_id 
                AND appointment_time.meta_key = 'appointment_time'
            LEFT JOIN {$wpdb->posts} created 
                ON p.ID = created.ID
            WHERE p.post_type = 'appointment'
                AND p.post_status = 'publish'
                AND appointment_date.meta_value BETWEEN %s AND %s
                AND appointment_time.meta_value IS NOT NULL
        ", $start_date, $end_date);
        
        $result = $wpdb->get_var($query);
        
        return round($result, 1);
    }
}

十三、系统集成与API扩展

1. 第三方日历同步

class CalendarSync {
    private $service;
    
    public function __construct($service = 'google') {
        switch ($service) {
            case 'google':
                $this->service = new GoogleCalendarSync();
                break;
            case 'outlook':
                $this->service = new OutlookCalendarSync();
                break;
            default:
                throw new Exception('不支持的日历服务');
        }
    }
    
    // 同步预约到外部日历
    public function sync_appointment($appointment_id, $action = 'create') {
        $appointment_data = $this->get_appointment_data($appointment_id);
        
        switch ($action) {
            case 'create':
                return $this->service->create_event($appointment_data);
            case 'update':
                return $this->service->update_event($appointment_data);
            case 'delete':
                return $this->service->delete_event($appointment_data['external_id']);
        }
    }
    
    // 从外部日历同步可用时间
    public function sync_availability($date) {
        $busy_slots = $this->service->get_busy_slots($date);
        return $this->convert_to_unavailable_slots($busy_slots);
    }
}

class GoogleCalendarSync {
    private $client;
    private $service;
    
    public function __construct() {
        $this->client = new Google_Client();
        $this->client->setAuthConfig(get_stylesheet_directory() . '/config/google-calendar.json');
        $this->client->addScope(Google_Service_Calendar::CALENDAR);
        $this->service = new Google_Service_Calendar($this->client);
    }
    
    public function create_event($appointment_data) {
        $event = new Google_Service_Calendar_Event(array(
            'summary' => '咨询预约 - ' . $appointment_data['client_name'],
            'description' => $appointment_data['notes'],
            'start' => array(
                'dateTime' => $appointment_data['start_datetime'],
                'timeZone' => 'Asia/Shanghai',
            ),
            'end' => array(
                'dateTime' => $appointment_data['end_datetime'],
                'timeZone' => 'Asia/Shanghai',
            ),
            'attendees' => array(
                array('email' => $appointment_data['client_email']),
                array('email' => get_option('admin_email'))
            ),
            'reminders' => array(
                'useDefault' => false,
                'overrides' => array(
                    array('method' => 'email', 'minutes' => 24 * 60),
                    array('method' => 'popup', 'minutes' => 30),
                ),
            ),
        ));
        
        $calendarId = 'primary';
        $event = $this->service->events->insert($calendarId, $event);
        
        return $event->getId();
    }
}

2. 微信小程序集成

class WechatMiniProgram {
    private $app_id;
    private $app_secret;
    
    public function __construct() {
        $this->app_id = get_option('wechat_app_id');
        $this->app_secret = get_option('wechat_app_secret');
    }
    
    // 获取微信用户openid
    public function get_user_openid($code) {
        $url = "https://api.weixin.qq.com/sns/jscode2session";
        $params = array(
            'appid' => $this->app_id,
            'secret' => $this->app_secret,
            'js_code' => $code,
            'grant_type' => 'authorization_code'
        );
        
        $response = wp_remote_get($url . '?' . http_build_query($params));
        
        if (is_wp_error($response)) {
            return false;
        }
        
        $body = json_decode(wp_remote_retrieve_body($response), true);
        
        return isset($body['openid']) ? $body['openid'] : false;
    }
    
    // 发送预约提醒模板消息
    public function send_appointment_reminder($openid, $appointment_data) {
        $access_token = $this->get_access_token();
        
        $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={$access_token}";
        
        $data = array(
            'touser' => $openid,
            'template_id' => get_option('wechat_reminder_template_id'),
            'page' => 'pages/appointment/detail?id=' . $appointment_data['id'],
            'data' => array(
                'thing1' => array('value' => $appointment_data['service_name']),
                'time2' => array('value' => $appointment_data['appointment_time']),
                'thing3' => array('value' => '请准时到达')
            )
        );
        
        $response = wp_remote_post($url, array(
            'headers' => array('Content-Type' => 'application/json'),
            'body' => json_encode($data),
            'timeout' => 10
        ));
        
        return !is_wp_error($response);
    }
}

十四、系统维护与监控

1. 自动化备份策略

class AppointmentBackup {
    // 创建预约数据备份
    public function create_backup() {
        $backup_data = array(
            'timestamp' => current_time('timestamp'),
            'appointments' => $this->export_appointments(),
            'services' => $this->export_services(),
            'settings' => $this->export_settings()
        );
        
本文来自网络投稿,不代表UFO.WORK®立场,转载请注明出处:https://www.ufo.work/20260130/7282.html

溯源库®作者

运营单位:漳州柔性供应链服务有限公司(投稿邮箱:vip@jiaochengku.com)
上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@jiaochengku.com

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部