分类 Typecho 下的文章

前言

typecho版本 : 1.2

主题 : handsome

我在使用handsome主题的时光机功能的时候,发现使用 img 标签显示的图片,全都无法显示。

cbe91770642110.png

de821770642135.png

我琢磨了半天,最后,在handsome主题文档中找到了解决办法。

解决方案

这个问题产生的原因是 Typecho默认 用户不能在评论中插入图片或html代码

需要在 '网站后台→网站设置→评论→允许使用的HTML标签和属性' 中添加以下标签

'''<img src=""><audio class="" src="" preload><video src=""></video>'''

在添加代码之后,评论(时光机)就可以显示图片了

typecho 默认的数据库不支持emoji,所以需要通过一下方式修改数据库的编码。

如果你的数据库不支持emoji,但是在文章编辑中或者主题设置中使用了emoji会导致你的内容丢失!

alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_options convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_users convert to character set utf8mb4 collate utf8mb4_unicode_ci;

执行上述sql语句来修改表的编码,如果用的是宝塔面板和MySQL数据库,一般有可视化的phpmyadmin界面,可以在phpmyadmin的控制台里面执行上面的语句,如果是服务器可以在服务器上连接mysql后执行。

最后将 Typecho 目录下的config.inc.php 配置文件中数据库定义参数中的 charset 为 utf8mb4

$db->addServer(array (
      'host'      =>  localhost, 
      'user'      =>  'root',
      'password'  =>  'root',
      'charset'   =>  'utf8mb4', //修改这一行
      'port'      =>  3306,
      'database'  =>  ''
  ), Typecho_Db::READ | Typecho_Db::WRITE);

如果还是不行,进入数据库管理软件phpmyadmin,选中要改的数据库,点击上方的操作,下滑找到排序规则,将选项改为utf8mb4_unicode_ci,记得选中下方选项框

效果预览

添加此功能后,您可以在博客侧边栏或页脚等位置实时显示当前网站的在线访客数量,如下图所示:

实现步骤

步骤一:添加统计函数代码

  • 默认主题:/usr/themes/default/functions.php
  • Handsome主题:/usr/themes/handsome/functions.php

在文件末尾添加以下代码:

/**
 * 在线人数统计函数
 */
function online_users() {
    // 基本配置参数
    $filename = 'online.txt';        // 数据文件路径,默认在网站根目录
    $cookiename = 'Typecho_Online';  // Cookie名称,用于标识访客
    $onlinetime = 30;                // 在线有效时间(秒),超过此时间未活动则视为离线
  
    // 读取在线用户数据文件
    $online = file_exists($filename) ? file($filename) : array();
    $nowtime = $_SERVER['REQUEST_TIME']; 
    $nowonline = array(); 
  
    // 清理过期的在线记录
    foreach($online as $line) { 
        $row = explode('|', $line); 
        $sesstime = trim($row[1]); 
        // 仅保留有效期内的记录
        if(($nowtime - $sesstime) <= $onlinetime) {
            $nowonline[$row[0]] = $sesstime;
        } 
    } 
  
    // 处理当前访客的Cookie
    if(isset($_COOKIE[$cookiename])) {
        // 已有Cookie,获取访客ID
        $uid = $_COOKIE[$cookiename]; 
    } else {
        // 无Cookie,生成新的唯一访客ID
        $vid = 0;
        do {
            $vid++; 
            $uid = 'U'.$vid; 
        } while(array_key_exists($uid, $nowonline)); 
  
        // 设置Cookie,默认会话期有效
        setcookie($cookiename, $uid); 
    } 
  
    // 更新当前访客的在线时间
    $nowonline[$uid] = $nowtime;
  
    // 计算在线总人数
    $total_online = count($nowonline); 
  
    // 将更新后的数据写回文件
    if($fp = @fopen($filename, 'w')) { 
        if(flock($fp, LOCK_EX)) { // 获取独占锁
            rewind($fp); 
            foreach($nowonline as $fuid => $ftime) { 
                $fline = $fuid.'|'.$ftime."\n"; 
                @fputs($fp, $fline); 
            } 
            flock($fp, LOCK_UN); // 释放锁
        } 
        fclose($fp);
    } 
  
    return $total_online; 
}

步骤二:在模板中显示在线人数

通用方法(适用于任何位置)

在需要显示在线人数的模板文件中,添加以下代码:

<div class="online-users">
    当前在线: <?php echo online_users(); ?> 人
</div>

Handsome主题侧边栏添加方法

  1. 编辑文件:/usr/themes/handsome/component/sidebar.php
  2. 在适当位置(如"统计信息"部分)添加:

<li class="list-group-item"><div class="text-second">
<span class="blog-info-icons"> 
<i data-feather="user"></i></span>
<span class="badge pull-right"><?php echo online_users() ?>
</span><?php _me("在线人数") ?></li>

页脚添加方法

编辑主题的footer.php文件,在合适位置添加:

<div class="site-info">
    <!-- 其他页脚信息 -->
    <span class="online-count">当前在线: <?php echo online_users(); ?> 人</span>
</div>

转载自Xuan's blog

文章标题:Typecho添加实时在线人数统计功能 本文地址:https://blog.ybyq.wang/archives/331.html