\u003c?php /** * WP_Pan_Download 主类 * 管理插件的核心功能和初始化 */ class WP_Pan_Download { /** * 初始化插件 */ public function init() { // 注册脚本和样式 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); // 初始化管理面板 $admin = new WP_Pan_Download_Admin(); $admin-\u003einit(); // 初始化设置 $settings = new WP_Pan_Download_Settings(); $settings-\u003einit(); // 初始化短代码 $shortcode = new WP_Pan_Download_Shortcode(); $shortcode-\u003einit(); // 注册元数据 add_action( 'init', array( $this, 'register_meta' ) ); // 初始化AJAX处理器 require_once plugin_dir_path( __FILE__ ) . '../includes/class-wp-pan-download-ajax.php'; $ajax = new WP_Pan_Download_Ajax(); $ajax-\u003einit(); // 添加下载处理钩子 add_action( 'wp_ajax_wp_pan_download_handle', array( $this, 'handle_download' ) ); add_action( 'wp_ajax_nopriv_wp_pan_download_handle', array( $this, 'handle_download' ) ); // 添加网盘目录浏览处理 add_action( 'wp_ajax_wp_pan_download_browse_dir', array( $this, 'browse_directory' ) ); } /** * 注册前端脚本和样式 */ public function enqueue_scripts() { wp_enqueue_style( 'wp-pan-download', WP_PAN_DOWNLOAD_URL . 'assets/css/wp-pan-download.css', array(), WP_PAN_DOWNLOAD_VERSION ); wp_enqueue_script( 'wp-pan-download', WP_PAN_DOWNLOAD_URL . 'assets/js/wp-pan-download.js', array( 'jquery' ), WP_PAN_DOWNLOAD_VERSION, true ); // 传递必要的变量给JavaScript wp_localize_script( 'wp-pan-download', 'wp_pan_download_params', array( 'ajax_url' =\u003e admin_url( 'admin-ajax.php' ), 'nonce' =\u003e wp_create_nonce( 'wp-pan-download-nonce' ), )); } /** * 注册管理面板脚本和样式 */ public function admin_enqueue_scripts() { wp_enqueue_style( 'wp-pan-download-admin', WP_PAN_DOWNLOAD_URL . 'assets/css/admin.css', array(), WP_PAN_DOWNLOAD_VERSION ); wp_enqueue_script( 'wp-pan-download-admin', WP_PAN_DOWNLOAD_URL . 'assets/js/admin.js', array( 'jquery' ), WP_PAN_DOWNLOAD_VERSION, true ); } /** * 注册元数据 */ public function register_meta() { register_meta( 'post', '_wp_pan_download_link', array( 'show_in_rest' =\u003e true, 'single' =\u003e true, 'type' =\u003e 'string', 'sanitize_callback' =\u003e 'sanitize_text_field', 'auth_callback' =\u003e array( $this, 'meta_auth_callback' ), )); register_meta( 'post', '_wp_pan_download_password', array( 'show_in_rest' =\u003e false, 'single' =\u003e true, 'type' =\u003e 'string', 'sanitize_callback' =\u003e 'sanitize_text_field', 'auth_callback' =\u003e array( $this, 'meta_auth_callback' ), )); } /** * 元数据权限回调 */ public function meta_auth_callback( $allowed, $meta_key, $post_id ) { return current_user_can( 'edit_post', $post_id ); } /** * 处理下载请求 */ public function handle_download() { // 验证nonce令牌 check_ajax_referer( 'wp-pan-download-nonce', 'nonce' ); $link = sanitize_text_field( $_POST['link'] ); $password = isset( $_POST['password'] ) ? sanitize_text_field( $_POST['password'] ) : ''; $post_id = isset( $_POST['post_id'] ) ? intval( $_POST['post_id'] ) : 0; // 检查是否有缓存的分享链接 $use_cache = $post_id > 0; $cached_share = $use_cache ? get_post_meta( $post_id, '_wp_pan_download_cached_share', true ) : ''; $cache_time = $use_cache ? get_post_meta( $post_id, '_wp_pan_download_cache_time', true ) : 0; $cache_expiry = 24 * HOUR_IN_SECONDS; // 缓存24小时 if ( $use_cache && !empty( $cached_share ) && time() - $cache_time < $cache_expiry ) { // 使用缓存的分享链接 $share_data = json_decode( $cached_share, true ); // 生成二维码 $qrcode_path = $this->generate_qrcode( $share_data['share_link'] ); if ( $qrcode_path ) { $share_data['qrcode_url'] = wp_upload_dir()['baseurl'] . '/wp-pan-download/qrcodes/' . basename( $qrcode_path ); } // 返回缓存结果 wp_send_json( array( 'code' => 1, 'msg' => '处理成功,请扫描二维码下载', 'data' => $share_data )); } // 使用新的Handler类处理文件转存 require_once plugin_dir_path( __FILE__ ) . '../includes/class-wp-pan-download-handler.php'; $handler = new WP_Pan_Download_Handler(); // 执行转存 $transfer_result = $handler->handle_transfer( $link, $password ); if ( !$transfer_result['success'] ) { wp_send_json( array( 'code' => 0, 'msg' => $transfer_result['message'], 'data' => array() )); } // 缓存分享链接 if ( $use_cache ) { $share_data = array( 'share_link' => $transfer_result['share_link'], 'share_code' => $transfer_result['share_code'], 'file_name' => $transfer_result['file_name'] ); update_post_meta( $post_id, '_wp_pan_download_cached_share', json_encode( $share_data ) ); update_post_meta( $post_id, '_wp_pan_download_cache_time', time() ); // 保存转存记录 $handler->save_transfer_record( array_merge( $share_data, array( 'source_url' => $link ) ) ); } // 生成二维码 $qrcode_path = $this->generate_qrcode( $transfer_result['share_link'] ); if ( $qrcode_path ) { $transfer_result['qrcode_url'] = wp_upload_dir()['baseurl'] . '/wp-pan-download/qrcodes/' . basename( $qrcode_path ); } // 返回结果 wp_send_json( array( 'code' => 1, 'msg' => $transfer_result['message'], 'data' => $transfer_result )); } /** * 浏览网盘目录 */ public function browse_directory() { // 验证用户权限 if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' =\u003e __( '没有权限执行此操作', 'wp-pan-download' ) ) ); } $pan_type = isset( $_POST['pan_type'] ) ? sanitize_text_field( $_POST['pan_type'] ) : 'baidu'; $pdir_fid = isset( $_POST['pdir_fid'] ) ? sanitize_text_field( $_POST['pdir_fid'] ) : '/'; // 创建传输类实例 $transfer = new WP_Pan_Download_Transfer(); // 获取文件列表 $result = $transfer-\u003 egetFiles( $pan_type == 'baidu' ? 2 : 0, $pdir_fid ); // 返回结果 wp_send_json( $result ); } /** * 生成二维码 */ public function generate_qrcode( $url ) { // 获取二维码大小设置 $size = intval( get_option( 'wp_pan_download_qrcode_size', 200 ) ); // 生成唯一文件名 $filename = 'qrcode_' . md5( $url . time() ) . '.png'; $upload_dir = wp_upload_dir(); $qrcode_dir = $upload_dir['basedir'] . '/wp-pan-download/qrcodes'; $qrcode_path = $qrcode_dir . '/' . $filename; // 确保目录存在 if ( ! file_exists( $qrcode_dir ) ) { wp_mkdir_p( $qrcode_dir ); } // 使用Google Charts API生成二维码 $qrcode_url = 'https://chart.googleapis.com/chart?chs=' . $size . 'x' . $size . '&cht=qr&chl=' . urlencode( $url ) . '&choe=UTF-8'; // 下载二维码图片 $response = wp_remote_get( $qrcode_url ); if ( ! is_wp_error( $response ) && wp_remote_retrieve_response_code( $response ) == 200 ) { $body = wp_remote_retrieve_body( $response ); // 保存到文件 file_put_contents( $qrcode_path, $body ); return $qrcode_path; } return false; } }