Joe1.4再续前缘版「游客付费可见」Bug修复教程

Joe1.4再续前缘版「游客付费可见」Bug修复教程

admin
昨天发布

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→刷新→隐藏内容自动出现!

5 解锁查看

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消
SSL