本文最后一次在 2022 年 03 月03 日更新,部分内容可能已经过时!
就怕忘了。万一啥时候主题一更新,或者手残一重装,又要重新来一遍可怎么办…

顶栏公告栏

修改效果:顶部导航栏下面滚动自定义的公告;后台的设置外观界面可以自定义公告和滚动速度

编辑当前外观中,在functions.phpfunction themeConfig($form)方法里添加代码

//公告栏设置
$notice = new Typecho_Widget_Helper_Form_Element_Textarea('notice', NULL, NULL, _t('公告'), _t('公告栏,可用一部分html标签'));
$form->addInput($notice);
$speed = new Typecho_Widget_Helper_Form_Element_Textarea('speed', NULL, NULL, _t('公告游动控制'), _t('设置公告文字游动速度'));
$form->addInput($speed);

然后,在header.php</nav>下增加公告栏位

<!-- 公告牌 -->
<div id="bbs">
    <marquee class="nav-link" scrollamount=<?php $this->options->speed(); ?> onmouseover=this.stop() onmouseout=this.start() style="line-height:18px;">  
</div>

<!-- 下面这个脚本,可以实现公告滚动几次之后自动隐藏 -->
<!-- 如果没有这个需求,可以不用;上方div的id也可以不用 -->
<!-- 用的话,在marquee标签里增加loop="数字"来给出循环次数 -->
<script>
    function hideboard(){
        bbs.style.display="none"
    }
</script>

修正https导致的问题

可能只在cloudflare使用flexible模式时候才需要修改。

具体看这里吧

获得评论者正确的ip地址

只需要在网站根目录的config.inc.php中,增加/修改一个字段即可:

/** IP地址来源 */
define('__TYPECHO_IP_SOURCE__', 'HTTP_X_FORWARDED_FOR');

/** 具体需要看phpinfo的PHP Variable里边能展示真正ip的字段 */

Typecho支持PHP7的修正

由于PHP7的一部分函数被取消,导致Typecho默认并不能支持PHP7.但只需要将根目录/config.inc.php中的$db = new Typecho_Db('Mysql', 'typecho_');更改为$db = new Typecho_Db('Pdo_Mysql', 'typecho_');,保存即可。

RAW主题去掉日志/说说切换栏

index.php中,带有“日志”和“说说”两个div删掉即可。

RAW主题,文章列表页顶栏修正

当把typecho的主页设置为静态页面时,文章列表(就是默认的首页)的顶栏会置空。应该是开发时没有注意到这个问题。
修复也很简单,在index.php中,将

<?php if ($this->is('index')): ?><!-- 页面为首页时 -->
最近文章
<?php if...

一句的if条件加上$this->is('front'),即条件语句变为

<?php if ($this->is('index') || $this->is('front')): ?><!-- 页面为首页/文章列表页时 -->

保存即可。

Access插件,控制面板仅管理员账号显示

  • 编辑Access的plugin.php文件,将active方法中的第2行最后一个参数修改为administrator,即改变成
Helper::addPanel(1, self::$panel, _t('Access控制台'), _t('Access插件控制台'), 'administrator');
  • 注释adminFooter方法中的所有行
  • 保存。如果不生效,则重新应用插件

RAW主题,增加前台注册页

最终效果:点击弹出登录窗口后,拥有链接导向注册页。点击后弹出注册窗口,用户可以输入用户名和邮箱注册,之后跳转到后台。

修改RAW主题的header.php文件

1、修改登录页,增加注册页链接

  • 找到action="<?php $this->options->loginAction()?>的form表单,在文本中加入注册页的链接:
<a style="text-decoration: underline" data-fancybox="" data-src="#hidden-register-form" href="javascript:;" target="_blank">注册</a>

2、增加注册表单

相同文档里,增加下述代码:

<div id="hidden-register-form" class="login-form" style="display:none">
    <form action="<?php $this->options->registerAction();?>" method="post" name="register" role="form">
        <p>注册</p>
        <p>
            <input type="hidden" name="_" value="<?php echo $this->security->getToken($this->request->getRequestUrl());?>">
            <input type="text" name="name" placeholder="用户名" required/>
        </p>
        <p>
            <input type="email" id="mail" name="mail" placeholder="邮箱" required/>
        </p>
        <p style="font-weight: bold; color: red">
            成功后请立刻修改密码!否则随机密码你是记不住的!
        </p>
        <button type="submit" name="loginsubmit" value="true">注册</button>
    </form>
</div>

保存即可。

随便看看功能

整合在热门文章插件中,可共同启停用。最终显示在电脑端左栏中。

  • 在热评插件的plugin.php中,增加功能:
public static function outputRandomPosts() {
    $archive = Typecho_Widget::widget('Widget_Archive');
    $pluginOpts = Typecho_Widget::widget('Widget_Options')->plugin('TePostViews');
    $sortBy = $pluginOpts->sortBy;
    $hotNums = $pluginOpts->hotNums;
    $minViews = $pluginOpts->minViews;
    $linkClass = $pluginOpts->linkClass;
    $hotNums = intval($hotNums) <= 0 ? 8 : $hotNums;
    $minViews = intval($minViews) <= 0 ? 0 : $minViews;
    $linkClass = strlen($linkClass) > 0 ? 'class="'.$linkClass.'" ' : '';
    $db = Typecho_Db::get();
    $select = $db->select()->from('table.contents')
        ->where('table.contents.type = ?', 'post')
        ->where('table.contents.status = ?', 'publish')
        ->order('', 'RAND()')
        ->limit($hotNums);
    $rows = $db->fetchAll($select);
    foreach ($rows as $row) {
        $row = $archive->filter($row);
        echo '<span><a ' . $linkClass . 'href="' . $row['permalink'] . '" title="' . $row['title'] . '">' . $row['title'] . '</a><br>
        <span style="margin-right:1em"><i class="fa fa-eye"></i>&nbsp;'.$row['viewsNum'].'</span>
        <span><i class="fa fa-comment"></i>&nbsp;'.$row['commentsNum'].'</span></span>';
    }
}
  • RAW主题的nav-left.php文件中,在nav标签合适位置增加下述代码:
<aside>
    <div id="hot-posts" style="animation-delay:0.4s">
        <span><i class="fa fa-random"></i> 随便看看</span>
        <?php TePostViews_Plugin::outputRandomPosts(); ?>
    </div>
</aside>

Access插件,兼容ipv6地址记录

通过直接记录ip,而不使用ip2long来保存。性能会下降

数据库:

access_log表中,修改ip列为varchar(100)

插件:

page/console.php: 类似于Access->long2ip()的字段全部只保留ip变量$log['ip']

Access_Core.php: 注释所有$ip = bindec(decbin(ip2long($ip)));

Access_IP.php: $nip2 = pack('N', ip2long($nip));改为$nip2 = pack('N', $nip);

编辑文章时增加标签选择列表

来源:Typecho Wiki

在typecho目录admin下找到write-post.php文件并进行编辑,在其中找到代码(大概在94行左右):

<p><input id="tags" name="tags" type="text" value="<?php $post->tags(',', false); ?>" class="w-100 text" /></p>

在这段代码后面增加如下代码:

<div id="exist-tags">
<p style="background: #fff;border: 1px solid #D9D9D6;display: block;padding: 2px 4px;">
<?php
$stack = Typecho_Widget::widget('Widget_Metas_Tag_Cloud')->stack;
$i = 0; 
while (isset($stack[$i])) {
  echo "<a id=\"mydiv$i\" style=\"cursor:pointer;padding: 0px 6px;margin: 2px 0;display: inline-block;\" onclick=\"mytag=document.getElementById('mydiv$i');mytag.style.backgroundColor='#E9E9E6';t=document.getElementById('tags').value;c=t?',':'';document.getElementById('tags').value=t+c+'",$stack[$i]['name'],"'\">",$stack[$i]['name'], "</a>";
  $i++;
  if (isset($stack[$i])) echo "  ";
}
?>
</p>
</div>

Typecho修改头像地址

现在gravatar的地址已经不可连接,所以替换为镜像源以确保头像可以正常显示。

前往网站根目录/var/Typecho/Common.php,将gravatarUrl方法中的网址按规律修改即可。具体镜像源可以参考知乎文章这个博客

已有 5 条评论

  1. 请问,我跟着您的视频做了一遍建站,然后在设置外观上遭遇到了问题,具体问题如下,不知道该如何添加服务器本地图片,logo和背景都不太正常 —— BI1ECX BI1ECX 发表。 回复TA
    1. 用的什么程序?wp还是typecho?
      图片之类的首先建议使用图床,如果一定需要服务器上面的图片的话,保证图片是通过wp或者typecho的附件功能上传的,否则就要保证图片上传的目录php所属用户有权限访问 —— 等我稍后补充昵称 等我稍后补充昵称 [作者] 于 发表。 回复TA
  2. 大佬,你这个博客的主题可以分享下吗? 感觉不错! —— 小虾米 小虾米 发表。 回复TA
    1. 这是我在官方主题基础上改的。但目前还有一堆东西没搞,比如说首页的分栏、置顶文章目前是直接写死的,所以可能分享了也不可用… —— 飞蚊话 飞蚊话 [作者] 于 发表。 回复TA
      1. 嗯,没事了,这两天,我写了一个和你这个外观差不多的主题,现在已经用在我的博客上了。 —— 小虾米 小虾米 发表。 回复TA

添加新评论