title: 【一步搞定】Joe1.4再续前缘版「游客付费可见」Bug修复教程
tags: 教程,Joe主题,付费可见,游客支付,一键修复
category: 技术随笔
status: publish
content:
1 问题简述
Joe1.4自带「付费可见」→游客支付成功→仍显示灰色遮罩,刷新也不出来。
2 修复思路(30秒看懂)
①支付时把游客IP写进订单表ip字段
②文章渲染时用当前IP查订单status=1
③命中→直接输出隐藏内容,无需登录3 一键修复代码(复制即用)
把下面代码粘到主题文件
public/function.php第1298行插入以下代码(搜pay view更快):
//支持CDN
function markdown_hide($content, $post, $login)
{
// 1. 复用你的 IP 获取逻辑(无需额外引入文件)
function get_visitor_ip($type=0){
$ip = $_SERVER['REMOTE_ADDR'];
if($type<=0 && isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
foreach ($matches[0] AS $xip) {
if (filter_var($xip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$ip = $xip;
break;
}
}
} elseif ($type<=0 && isset($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif ($type<=1 && isset($_SERVER['HTTP_CF_CONNECTING_IP']) && filter_var($_SERVER['HTTP_CF_CONNECTING_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif ($type<=1 && isset($_SERVER['HTTP_X_REAL_IP']) && filter_var($_SERVER['HTTP_X_REAL_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$ip = $_SERVER['HTTP_X_REAL_IP'];
}
return $ip;
}
// 2. 数据库查询订单(适配 typecho_orders 表结构)
$db = \Typecho_Db::get();
$prefix = $db->getPrefix();
$currentCid = $post->cid;
$visitorIp = get_visitor_ip();
$showContent = false;
$payment = null;
// 登录用户:用 user_id 匹配订单(typecho_orders 表的 user_id 字段)
if ($login) {
$payment = $db->fetchRow($db->select()
->from($prefix . 'orders')
->where('content_cid = ?', $currentCid) // 文章ID匹配
->where('user_id = ?', USER_ID) // 登录用户ID匹配
->where('status = ?', 1) // 1=已支付(你的表状态字段)
->limit(1));
}
// 游客:用 IP 匹配订单(typecho_orders 表的 ip 字段,已存游客IP)
else {
$payment = $db->fetchRow($db->select()
->from($prefix . 'orders')
->where('content_cid = ?', $currentCid)
->where('ip = ?', $visitorIp) // 直接用表中已存的 ip 字段匹配
->where('status = ?', 1)
->limit(1));
}4 立即体验(照抄即可)
新建文章→编辑器切Markdown→复制下方整块→发布→无痕模式访问→支付0.01→刷新→隐藏内容自动出现!