zimoli
  • 用户中心
    • 登录 / 注册
  • 快速搜索
  • 技术支持
    • 提交问题
    • 查看全部问题
  • 快捷操作
    • 上个内容
    • 页面顶部
    • 用户评论
    • 页面底部
  • 示例页面
    • 通知公告中心
    • 未发布通知公告
    • 技术支持中心
    • 没有提问或工单
    • 打开购物车
    • 您的购物车为空
    • 图文模式
    • 文本模式
    • 精简模式
  • 登录 / 注册
    • 没有账号注册

  • 测试
  • 未分类
  • 代码高亮
0

代码高亮

2025年11月11日9

<?php
/**
 * @package ZMLTheme\Cores
 */

namespace ZMLTheme\Cores;

use ZMLTheme\Utils\Base as BaseUtil;

defined( 'ZMLTHEME_PRESENT' ) or die( 'Access Denied' );

/**
 * Class ZMLTheme\Cores\Down
 *
 * 下载数据类
 *
 * @since 1.0.0
 */

class Down {

	public function __construct() {}

	/**
	 * 是否下载内容
	 * 
	 * @param int $post
	 *
	 * @return bool
	 */
	function checkDown( $post = null ) {
		
		$post = $post ?: \get_the_ID();
		$down = BaseUtil::getMeta( 'post', $post, 'down-post' );
		$down = $down ? true : false;

		return $down;
		
	}

	/**
	 * 检查权限
	 * 
	 * @param int $post
	 *
	 * @return string
	 */
	public function checkAuth( $post ) {

		global $options;

		//* 获取访问设置
		$auth = BaseUtil::getMeta( 'post', $post, 'down-auth' );
		$auth = $auth ?: $options['down-auth'];
		
		//* 判断权限
		switch ( $auth ) {
			//* 不限
			case 'guest':
				$auth = 'allow';
				break;
			//* 登录
			case 'login':
				if ( \is_user_logged_in() ) {
					$auth = 'allow';
				} else {
					$auth = 'login';
				}
				break;
			//* 回复
			case 'reply':
				if ( \is_user_logged_in() ) {
					if ( \current_user_can( 'publish_posts' ) ) {
						$auth = 'allow';
					} else {
						global $wpdb, $current_user;
						$email = $current_user->user_email;
						$comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_author_email = '%s' and comment_post_id = '%s' and comment_approved = '1'", $email, $post ) );
						if ( $comments ) {
							$auth = 'allow';
						} else {
							$auth = 'reply';
						}
					}
				} else {
					$auth = 'reply';
				}
				break;
			//* 其他
			default:
				$auth = 'other';
				break;
		}

		return $auth;
		
	}

	/**
	 * 读取下载数据
	 * 
	 * @param int $post
	 *
	 * @return array
	 */
	public function readDown( $post ) {

		global $options;

		//* 获取数据
		$name = ['down-name', 'down-desc', 'down-demo', 'down-load', 'down-pass', 'down-count', 'down-date'];
		$data = BaseUtil::getMeta( 'post', $post, $name );
		
		//* 处理数据
		$data['down-name']  = $data['down-name'] ?: 'Unknown-Name';
		$data['down-pass']  = $data['down-pass'] ?: $options['down-pass'];
		$data['down-pass']  = $data['down-pass'] ?: '未加密';
		$data['down-show']  = $options['down-show'] ?: 0;
		$data['down-count'] = $data['down-count'] ?: '0';
		$data['down-date']  = $data['down-date'] ?: \get_the_time( 'Y-m-d', $post );

		return $data;

	}

	/**
	 * 加载静态文件
	 * 
	 * @param int $post
	 *
	 * @return string
	 */
	public function loadFile( $type ) {

		if ( $type === 'css' ) {
			echo '<link rel="stylesheet" type="text/css" href="' . esc_url( BaseUtil::getConst( 'URL_CSS' ) . 'down.css' ) . '">';
		} elseif ( $type === 'js' ) {
			echo '<script type="text/javascript" src="' . esc_url( BaseUtil::getConst( 'URL_JS' ) . 'jquery.js' ) . '"></script>';
			echo '<script type="text/javascript" src="' . esc_url( BaseUtil::getConst( 'URL_JS' ) . 'down.js' ) . '"></script>';
			echo '<script type="text/javascript" src="' . esc_url( BaseUtil::getConst( 'URL_JS' ) . 'icon.js' ) . '"></script>';
		}

	}

	/**
	 * 解析演示链接
	 *
	 * @param string $demo
	 * @param int    $post
	 * 
	 * @return array
	 */
	public function demoLink( $demo, $post ) {

		//* 分解演示地址
		$demo  = trim( $demo, ',' );
		$demo  = explode( ',', $demo );
		$total = count( $demo );
		
		for ( $i = 0; $i < $total; $i++ ) {

			$link['item'] = $i;

			//* 分解单条地址
			$split = explode( '|', $demo[$i] );
			$count = count( $split );
			
			//* 获取下载信息
			switch ( $count ) {
				//* 单链接
				case 1:
					$link['title'] = '演示地址';
					$link['url']   = $split[0];
					break;
				//* 标题和链接
				case 2:
					$link['title'] = $split[0];
					$link['url']   = $split[1];
					break;
				default:
					$link['title'] = '格式错误';
					$link['url']   = '';
					break;
			}
			
			//* 安全链接
			if ( $link['url'] !== '' ) {
				$link['safe'] = \esc_url( \home_url( '/down/demo/' ) );
				$link['safe'] = \add_query_arg( 'id', $this->safeCode( $post . '-' . $link['item'] ), $link['safe'] );
			} else {
				$link['safe'] = '';
			}
			
			$result['link'][] = $link;
			
		}
		
		$result['total'] = $total;
		
		return $result;
		
	}
	
	/**
	 * 解析下载链接
	 *
	 * @param string $down
	 * @param int    $post
	 * 
	 * @return array
	 */
	public function downLink( $down, $post ) {

		//* 分解下载地址
		$down  = trim( $down, ',' );
		$down  = array_reverse( explode( ',', $down ) );
		$total = count( $down );
		
		for ( $i = 0; $i < $total; $i++ ) {
			
			$link['item'] = $i;
			
			//* 分解单条地址
			$split = explode( '|', $down[$i] );
			$count = count( $split );
			
			//* 获取下载信息
			switch ( $count ) {
				//* 单链接
				case 1:
					$link['title'] = '下载地址';
					$link['url']   = trim( $split[0] );
					break;
				//* 标题和链接
				case 2:
					$link['title'] = trim( $split[0] );
					$link['url']   = trim( $split[1] );
					break;
				default:
					$link['title'] = '格式错误';
					$link['url']   = '';
					break;
			}
			
			//* 获取链接信息
			if ( $link['url'] !== '' ) {

				//* 客户端
				$client = [
					'thunder' => ['迅雷下载', 'xunlei'],
					'magnet'  => ['磁力链接', 'magnet'],
					'ed2k'    => ['ED2K 链接', 'ed2k'],
					'ctfile'  => ['城通小通', 'ctfile'],
					'ftp'     => ['FTP 下载', 'ftp'],
				];

				//* 网盘云盘
				$cloud = [
					'pan.baidu.com'       => ['百度网盘', 'baidu'],
					'pan.xunlei.com'      => ['迅雷云盘', 'xunlei'],
					'aliyundrive.com'     => ['阿里云盘', 'aliyun'],
					'cloud.189.cn'        => ['天翼云盘', 'tianyi'],
					'caiyun.139.com'      => ['和彩云', 'caiyun'],
					'115.com'             => ['115 网盘', 'yiyiwu'],
					'share.weiyun.com'    => ['腾讯微云', 'weiyun'],
					'jianguoyun.com'      => ['坚果云', 'jianguo'],
					'drive.bytenet.cn'    => ['城通网盘', 'ctfile'],
					'drfs.ctcontents.com' => ['城通直连', 'ctfile'],
					'www.123865.com'      => ['123 云盘', 'yiersan'],
					'www.123684.com'      => ['123 云盘', 'yiersan'],
					'www.123912.com'      => ['123 云盘', 'yiersan'],
				];

				//* 解析链接
				$parse  = \wp_parse_url( $link['url'] );
				$scheme = isset( $parse['scheme'] ) ? $parse['scheme'] : '';
				$host   = isset( $parse['host'] ) ? $parse['host'] : '';
				$path   = isset( $parse['path'] ) ? $parse['path'] : '';
				$fast   = stripos( $host, '.lanzou' );

				//* 判断类型
				if ( $fast ) {
					$link['type'] = '高速下载';
					$link['icon'] = 'speed';
				} else {
					if ( isset( $client[$scheme] ) ) {
						$link['type'] = $client[$scheme][0];
						$link['icon'] = $client[$scheme][1];
					} else {
						if ( isset( $cloud[$host] ) ) {
							$link['type'] = $cloud[$host][0];
							$link['icon'] = $cloud[$host][1];
						} else if ( stripos( $path, '/downloads/' ) !== false ) {
							$link['type'] = '商城产品';
							$link['icon'] = 'shop';
						} else if ( stripos( $host, 'lanzou' ) !== false ) {
							$link['type'] = '蓝奏云';
							$link['icon'] = 'cloud';
						} else if ( stripos( $host, 'ctfile' ) !== false ) {
							$link['type'] = '城通网盘';
							$link['icon'] = 'ctfile';
						} else {
							$link['type'] = '普通下载';
							$link['icon'] = 'http';
						}
					}
				}

				//* 安全链接
				if ( $fast ) {
					$link['safe'] = \esc_url( \home_url( '/down/fast/' ) );
					$link['safe'] = \add_query_arg( 'id', $this->safeCode( $post . '-' . $link['item'] ), $link['safe'] );
				} else {
					$link['safe'] = \esc_url( \home_url( '/down/load/' ) );
					$link['safe'] = \add_query_arg( 'id', $this->safeCode( $post . '-' . $link['item'] ), $link['safe'] );
				}

			} else {

				$link['type'] = '无效地址';
				$link['icon'] = 'break';
				$link['safe'] = '';

			}
			
			$result['link'][] = $link;
			
		}
		
		$result['total'] = $total;
		
		return $result;
		
	}

	/**
	 * 高速下载链接
	 *
	 * @param string $code
	 *
	 * @return string
	 */
	public function fastLink( $url ) {

		// Agent 列表
		$agents = [
			'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
			'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
			'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
			'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15',
			'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
			'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1',
			'Mozilla/5.0 (Linux; Android 14; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36',
			'Mozilla/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1',
		];
		
		$args   = [
			'timeout'     => 30,
			'redirection' => 5,
			'httpversion' => '1.1',
			'user-agent'  => $agents[ array_rand( $agents ) ],
			'headers'     => [
				'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
				'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8',
				'Accept-Encoding' => 'gzip, deflate, br',
				'Cache-Control' => 'no-cache',
				'Connection' => 'keep-alive',
				'Upgrade-Insecure-Requests' => '1',
				'Sec-Fetch-Dest' => 'document',
				'Sec-Fetch-Mode' => 'navigate',
				'Sec-Fetch-Site' => 'none',
				'Sec-Fetch-User' => '?1',
			],
			'cookies' => [],
		];

		$remote = \wp_remote_get( $url, $args );
		$result = [
			'mark' => false,
			'link' => $url,
		];

		if ( ! \is_wp_error( $remote ) ) {
			$code = \wp_remote_retrieve_response_code( $remote );
			$body = \wp_remote_retrieve_body( $remote );
			if ( $code === 200 && $body  ) {
				preg_match( '/<iframe[^>]*src=["\']?([^"\' >]+)["\' ]?[^>]*>/i', $body, $match );
				if ( ! empty( $match[1] ) ) {
					$parsed = parse_url( $url );
					$result = [
						'mark' => true,
						'link' => \esc_url( $parsed['scheme'] . '://' . $parsed['host'] . $match[1] ),
					];
				}
			}
		}

		return $result;

	}

	/**
	 * 安全代码
	 *
	 * @param string $code
	 *
	 * @return string
	 */
	public function safeCode( $code ) {

		$code = $this->codeNonce( $code ) .  base64_encode( $code );
		$code = str_replace( ['+', '/'], ['-', '_'], $code );

		return $code;

	}

	/**
	 * 读取代码
	 *
	 * @param string $code
	 *
	 * @return string
	 */
	public function readCode( $code ) {

		$code = str_replace( ['-', '_'], ['+', '/'], $code );
		$safe = substr( $code, 0, 10 );
		$code = base64_decode( substr( $code, 10 ) );
		$code = $code && $this->codeNonce( $code, $safe ) ? $code : '';
		
		return $code;

	}

	/**
	 * 代码验证
	 *
	 * @param string $code
	 * @param string $nonce
	 *
	 * @return mixed
	 */
	public function codeNonce( $code, $nonce = null ) {

		$key   = defined( 'NONCE_KEY' ) ? NONCE_KEY : ( defined( 'AUTH_KEY' ) ? AUTH_KEY : \home_url() );
		$md5   = substr( md5( $key . $code ), 12, 10 );
		$nonce = $nonce ? ( $md5 == $nonce ) : $md5;

		return $nonce;

	}

	/**
	 * 隐藏来源
	 *
	 * @param string $url
	 * 
	 * @return bool
	 */
	public function hideFrom( $url ) {
		
		global $options;
		
		//* 默认值
		$hide = false;

		if ( $options['down-safe'] === true ) {

			//* 主机
			$site = \wp_parse_url( \home_url(), PHP_URL_HOST );;
			$file = \wp_parse_url( $url, PHP_URL_HOST );

			//* 扩展名等
			$path = \wp_parse_url( $url, PHP_URL_PATH );
			$edd  = strpos( $path, '/downloads/' ); //* 是否 EDD 链接
			$ext  = pathinfo( $path, PATHINFO_EXTENSION );
			$type = ['zip', 'rar', '7z', 'cab', 'iso', 'jar', 'tar', 'gz'];

			//* 本地非 EDD 链接或指定类型文件
			if ( ( $file === $site && $edd === false ) || in_array( $ext, $type ) ) {
				$hide = true;
			}

		}

		return $hide;
		
	}
	
	/**
	 * 加载演示
	 *
	 * @param int $post
	 * @param int $item
	 *
	 * @return string
	 */
	public function loadDemo( $post, $item ) {

		//* 演示地址
		$demo = BaseUtil::getMeta( 'post', $post, 'down-demo' );
		$demo = trim( $demo, ',' );
		$demo = array_reverse( explode( ',', $demo ) );
		
		//* 获取单条地址
		$split = explode( '|', $demo[$item] );
		$count = count( $split );
		
		//* 获取演示地址
		switch ( $count ) {
			//* 单链接
			case 1:
				$link = trim( $split[0] );
				break;
			//* 标题和链接
			case 2:
				$link = trim( $split[1] );
				break;
			default:
				$link = '';
				break;
		}
		
		return $link;
		
	}

	/**
	 * 加载下载
	 *
	 * @param int $post
	 * @param int $item
	 *
	 * @return string
	 */
	public function loadDown( $post, $item ) {

		//* 获取下载地址
		$name = ['down-load', 'down-count'];
		$data = BaseUtil::getMeta( 'post', $post, $name );

		//* 资源下载计数
		$data['down-count'] = $data['down-count'] ?: 0;
		BaseUtil::updateMeta( 'post', $post, 'down-count', $data['down-count'] + 1 );

		//* 用户下载计数
		if ( \is_user_logged_in() ) {
			$user  = \wp_get_current_user();
			$count = $user->user_download ?: 0;
			//* Util 中 updateMeta 方法会自动添加“_”前缀,此处不能使用。
			\update_user_meta( $user->ID, 'user_download', $count + 1 );
		}

		//* 分解下载地址
		$load = trim( $data['down-load'], ',' );
		$load = array_reverse( explode( ',', $load ) );
		
		//* 获取单条地址
		$split = explode( '|', $load[$item] );
		$count = count( $split );
		
		//* 获取文件地址
		switch ( $count ) {
			//* 单链接
			case 1:
				$link = trim( $split[0] );
				break;
			//* 标题和链接
			case 2:
				$link = trim( $split[1] );
				break;
			default:
				$link = '';
				break;
		}
		
		return $link;
		
	}

	/**
	 * 加载高速下载
	 *
	 * @param string $code
	 *
	 * @return string
	 */
	public function loadFast( $post, $item ) {

		//* 获取下载地址
		$name = ['down-name', 'down-load', 'down-count'];
		$data = BaseUtil::getMeta( 'post', $post, $name );

		$data['down-name']  = $data['down-name'] ?: 'Unknown-Name';
		$data['down-count'] = $data['down-count'] ?: 0;

		//* 资源下载计数
		BaseUtil::updateMeta( 'post', $post, 'down-count', $data['down-count'] + 1 );

		//* 用户下载计数
		if ( \is_user_logged_in() ) {
			$user  = \wp_get_current_user();
			$count = $user->user_download ?: 0;
			//* Util 中 updateMeta 方法会自动添加“_”前缀,此处不能使用。
			\update_user_meta( $user->ID, 'user_download', $count + 1 );
		}

		//* 分解下载地址
		$load = trim( $data['down-load'], ',' );
		$load = array_reverse( explode( ',', $load ) );
		
		//* 获取单条地址
		$split = explode( '|', $load[$item] );
		$count = count( $split );

		//* 获取文件地址
		switch ( $count ) {
			//* 单链接
			case 1:
				$fast['name'] = $data['down-name'];
				$fast['link'] = trim( $split[0] );
				break;
			//* 标题和链接
			case 2:
				$fast['name'] = $data['down-name'] . ' - ' . trim( $split[0] );
				$fast['link'] = trim( $split[1] );
				break;
			default:
				$fast['name'] = $data['down-name'];
				$fast['link'] = '';
				break;
		}
		
		return $fast;

	}

	/**
	 * 安全下载
	 *
	 * @param string $link
	 */
	public function safeDown( $link ) {			

		//* 输出文件内容
		if ( $link !== '' ) {
			
			//* 获取数据
			$file = \esc_url( $link );
			$name = basename( $file ) ?? '';
			$size = get_headers( $file, true )['Content-Length'] ?? '';

			//* 输出 HTTP 头
			header( 'Content-Description: File Transfer' );
			header( 'Content-Type: application/octet-stream' );
			header( 'Content-Disposition: attachment; filename=' . $name );
			header( 'Content-Transfer-Encoding: binary' );
			header( 'Content-length: ' . $size );
			header( 'Expires: 0' );
			header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
			header( 'Pragma: public' );
			//* 清空缓冲区
			ob_clean();
			//* 清除缓存
			flush();
			//* 输出文件
			readfile( $file );
			exit;

		} else {
			
			echo ( '下载地址错误!' );
			
		}
		
	}
	
}

 


初始发布:2025年11月11日

TAGS:无标签
上个内容
下个内容
共 0 条评论

还没有任何评论!

发表评论 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注