本文详细记录了我在搭建个人博客网站的过程,同时也汇集了一系列宝贵的资料。

# 准备工作

# 服务器 + 宝塔 Linux 面板 + WordPress

前期的准备工作自然是选择一个合适的服务器,这里我选择了阿里云 99 优惠的服务器,主要是便宜,一个月不到 9 块。

为了搭建一个既美观又实用的个人网站,我也是在网上冲浪了很久,最后把目标锁定在宝塔 Linux 面板 + WordPress 上。WordPress 是一个基于 PHP 的网站建设平台,以其丰富的插件和主题库而闻名。它易于安装和使用,即便是编程新手也能轻松上手,快速搭建出既美观又功能强大的网站。最重要的是,我在 github 上找到一款 WordPress 主题 Sakura,完美契合了我的审美需求。

关于阿里云服务器的配置、宝塔面板的安装和 WordPress 的部署,我基本完全按照这篇博客来做,过程非常简单,也没有什么奇奇怪怪的问题。

除了基本的搭建流程,我还额外完成了两项工作:一是设置图床,二是实现了服务器文件的上传与下载功能。

# 图床

考虑到服务器存储空间的有限性,将所有图片直接存放在服务器上显然不是一个明智的选择。因此需要图床用于存放博客所需的图片资源。这里选择的是 gitee,原因有二:首先,我通常使用 GitHub,而 Gitee 提供了一个更为简洁且没有社交干扰的环境;其次,Gitee 的访问速度快,无需翻墙即可使用。

当然了,每次使用 git 上传图片难免过程繁琐,效率低下。查找相关资料时,我发现 PicGo 工具可以实现一键上传功能,还可以和 Typora 绑定(由于我个人的习惯,没有绑定 Typora,因为不是所有图片都要上传到图床的)。相关的配置教程参考这篇博客,基本上照着做就行,但是由于博客发布比较早,PicGo 的版本已经更新到 2.3.1 了,对应新版本下载地址是 PicGo

有了 PicGo,以后写博客需要引入图片时,只需要把图片一键上传到 Gitee。而 PicGo 会很贴心地把内容复制到剪贴板,而且是 markdown 格式的,让我能够无缝地将图片嵌入到我的博客文章中,真的非常方便。

# 服务器文件上传与下载

在使用服务器进行文件管理时,经常需要对文件进行修改,上传或下载。虽然使用 VSCode 结合 SSH 可以方便地读写服务器上的文件,但在文件的上传和下载方面,它可能就不那么便捷了。为了解决这个问题,我推荐使用 WinSCP 工具。WinSCP 操作方式简洁直观,只需简单的拖放动作,即可轻松完成文件的上传和下载任务,这也是阿里云官方推荐的一种方法。这里附上对应的使用教程

使用 WinSCP 连接时的设置

  • 文件协议:选择 SFTP 或 SCP。
  • 主机名:Linux 云服务器的公网 IP 地址。
  • 端口号:默认为 22。
  • 用户名:登录云服务器的用户名,默认为 root。
  • 密码:购买 Linux 云服务器设置的密码或通过密钥方式转换后的密码。

# Sakura 配置

Sakura 主题的页面精美,二次元味道浓厚,非常适合我这种肥宅,而且关于 Sakura 配置的博客也非常多,本节就记录我博客网站用到的一些配置。

关于一些基本操作,比如下载安装等,都在这篇博客里。还有 Sakura 主题基本的使用方法,这篇博客也介绍得非常详尽,因此本文仅记录用到的一些非 Sakura 原生的配置。

后面的配置都需要先在 WordPress 控制面板中 Sakura 主题设置的 CDN 中打开 “本地调用主题 js、css 文件”,而且必要时需清理浏览器缓存,这非常重要。

# 参考资料

Wordpress Sakura? 主题使用手册 | 流年,谁给过的倾城 | Yremp

Sakura 主题美化系列(一)如何在菜单旁添加会动的小图标 – Ukenn Blog

『Sakura 主题美化 #01』在博客菜单上添加动态图标吧! - 雾时之森 (fairysen.com)

顶部 logo 是指顶部导航栏左侧的图标文字。

首先将下面 CSS 代码复制到 WordPress 管理面板 — 外观 — Sakura 主题设置 — 基本设置最下面的 "自定义 CSS 样式" 里。

/*  logo  */
.logolink a {
    color: #464646;
    float: left;
    font-size: 20px;
    font-weight: 800;
    height: 56px;
    line-height: 56px;
    padding-left: 35px;
    padding-right: 15px;
    padding-top: 11px;
    text-decoration-line: none
}
 
.logolink .sakuraso {
    background-color: rgba(255, 255, 255, .5);
    border-radius: 5px;
    color: #464646;
    height: auto;
    line-height: 25px;
    margin-right: 0;
    padding-bottom: 0px;
    padding-top: 1px;
    text-size-adjust: 100%;
    width: auto
}
 
.logolink a:hover .sakuraso {
    background-color: #3aa800;
    color: #fff;
}
 
.logolink a:hover .shironeko,
.logolink a:hover .no,
.logolink a:hover rt {
    color: #3aa800;
}
 
.logolink.moe-mashiro a {
    color: #464646;
    float: left;
    font-size: 25px;
    font-weight: 800;
    height: 56px;
    line-height: 56px;
    padding-left: 6px;
    padding-right: 15px;
    padding-top: 11px;
    text-decoration-line: none;
}
.logolink.moe-mashiro .sakuraso,.logolink.moe-mashiro .no {
    font-size: 25px;
    border-radius: 9px;
    padding-bottom: 2px;
    padding-top: 5px;
}
 
.logolink.moe-mashiro .no {
    font-size: 20px;
    display: inline-block;
    margin-left: 5px;
}
 
.logolink a:hover .no {
    -webkit-animation: spin 1.5s linear infinite;
    animation: spin 1.5s linear infinite;
}
 
.logolink ruby {
    ruby-position: under;
    -webkit-ruby-position: after;
}
 
.logolink ruby rt {
    font-size: 10px;
    letter-spacing:2px;
    transform: translateY(-15px);
    opacity: 0;
    transiton-property: opacity;
    transition-duration: 0.5s, 0.5s;
}
 
.logolink a:hover ruby rt {
    opacity: 1
}
 
.moe-mashiro {
    font-family: 'wenyihei-subfont', 'Merriweather Sans', Helvetica, Tahoma, Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif;;
}
.chinese-font {
    font-family: 'Merriweather Sans', Helvetica, Tahoma, Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei', 'WenQuanYi Micro Hei', sans-serif;
}

然后修改 header.php 文件。

将原文件对应的代码修改成:

<!-- <header class="site-header no-select" role="banner"> -->
<header class="site-header no-select is-homepage gizle sabit" role="banner">
	<div class="site-top">
		<div class="site-branding">
			<?php if (akina_option('akina_logo')){ ?>
			<div class="site-title">
				<a href="<?php bloginfo('url');?>"><img src="<?php echo akina_option('akina_logo'); ?>"></a>
			</div>
			<?php }else{ ?>
			<span class="site-title">
				<!-- <span class="logolink serif"> -->
				<span class="logolink moe-mashiro">
					<a href="<?php bloginfo('url');?>">
						<!-- <span class="site-name"><?php echo akina_option('site_name', ''); ?></span> -->
						<ruby>
								<span class="sakuraso">穷拾</span>
								<span class="no"></span>
								<span class="shironeko">小屋</span>
								<rp></rp>
								<rt class="chinese-font">Jongsh's Blog</rt>
								<rp></rp>
						</ruby>
					</a>
				</span>
			</span>
			<?php } ?>
			<!-- logo end -->

# 导航栏

导航栏实际上就是菜单,只需要在 WordPress 管理面板里进行相关设置即可。这里介绍的是如何设置带图标有动画效果的导航栏。

在菜单设置部分,可以选择需要修改的菜单项中的 "导航标签",比如首页可以修改成下面的内容:

<span class="faa-parent animated-hover"><i class="fa fa-home faa-wrench"></i> 首页</span>

如果需要修改图标和动画效果,可以配合 Font Awesome 中文网Font Awesome Animation 这两个网站使用。

比如我希望给新的页面 "日历" 也加上图标和动画,到 Font Awesome 中文网 找到心仪的图标:

然后点击进去复制代码,并且也到 Font Awesome Animation 里选择合适的动画效果,然后修改 "导航标签" 的内容如下:

<span class="faa-parent animated-hover"><i class="fa fa-clock-o faa-spin"></i> 日历</span>

这里最开始尝试的时候一直没有成功,后来发现似乎是 Sakura 引入的样式是旧版的,所以找图标时也必须选用旧版网站的图标。

整理一下:

Font Awesome 旧版入口:https://fontawesome.com.cn/v4

Font Awesome 新版入口:https://fontawesome.com.cn/

Font Awesome 动画:https://l-lin.github.io/font-awesome-animation/

# 封面页

封面页的设置其实应该属于 Sakura 原生的配置。这里我选用的是随机图,因为更好看一些。

基本的配置操作是:

  • 在 WordPress 管理面板 — Sakura 主题设置 — 第一屏勾选内置原图随机图
  • 将想要使用的多张图片放到主题文件下的 /manifest/gallary/ 下,这就可以使用 WinSCP 很方便地上传文件了。

设置完后刷新页面,应该就可以看到首页封面使用随机图了。

# 首页封面动态波浪效果

首先在 header.php 文件中添加如下如下两行代码:

<div id="banner_wave_1"></div>
<div id="banner_wave_2"></div>

修改后的部分代码如下:

<?php 
if(!akina_option('head_focus')){ 
$filter = akina_option('focus_img_filter');
?>
<div class="headertop <?php echo $filter; ?>">
	<?php get_template_part('layouts/imgbox'); ?>
	<div id="banner_wave_1"></div>
	<div id="banner_wave_2"></div>
</div>	
<?php } ?>

然后将将下面的 CSS 代码复制到主题目录的 style.css 文件最后:

/* 动态波浪效果 */
@-webkit-keyframes wave1/*Safari and Chrome*/
{
0% { left:-1500px;bottom:-5px}
	50%{ left:0px;bottom:0px}
	100%{ left:-1500px;bottom:-5px}
}
 
@-webkit-keyframes wave2
{
0% { left:-1450px}
	50%{ left:0px}
	100%{left:-1450px}
 
}
@keyframes wave1/*Safari and Chrome*/
{
0% { left:-1500px;bottom:-5px}
	50%{ left:0px;bottom:0px}
	100%{ left:-1500px;bottom:-5px}
}
 
@keyframes wave2
{
0% { left:-1450px}
	50%{ left:0px}
	100%{left:-1450px}
 
}
#banner_wave_1 {
    width:auto;
    height:65px;
    background:url("https://cdn.jsdelivr.net/gh/yremp/resource@2.0/img/other/wave1.png") repeat-x;
    _filter:alpha(opacity=80);
    position:absolute;
    bottom:0;
    width:400%;
    left:-236px;
    z-index:5;
    opacity:1;
    transiton-property:opacity,bottom;
    animation:wave1 90s infinite;
    -webkit-animation:wave1 90s infinite;
}
#banner_wave_2 {
    width:auto;
    height:80px;
    background:url("https://cdn.jsdelivr.net/gh/yremp/resource@2.0/img/other/wave2.png") repeat-x;
    _filter:alpha(opacity=80);
    position:absolute;
    bottom:0;
    width:400%;
    left:0;
    z-index:4;
    opacity:1;
    transiton-property:opacity,bottom;
    animation:wave2 90s infinite;
    -webkit-animation:wave2 90s infinite;
}
.banner_wave_hide,.banner_wave_hide_fit_skin {
    opacity:0 !important;
    bottom:-999px !important
}
@media(max-width:860px) {
    #banner_wave_1,#banner_wave_2 {
    display:inline-block;
    
}
@-webkit-keyframes wave1/*Safari and Chrome*/
{
0% { left:-750px;bottom:-2px}
	50%{ left:0px;bottom:0px}
	100%{ left:-750px;bottom:-2px}
}
 
@-webkit-keyframes wave2
{
0% { left:-750px}
	50%{ left:0px}
	100%{left:-750px}
 
}
@keyframes wave1/*Safari and Chrome*/
{
0% { left:-750px;bottom:-2px}
	50%{ left:0px;bottom:0px}
	100%{ left:-750px;bottom:-2px}
}
 
@keyframes wave2
{
0% { left:-750px}
	50%{ left:0px}
	100%{left:-750px}
 
}
#banner_wave_1 {
    width:auto;
    height:65px;
    background:url("https://cdn.jsdelivr.net/gh/yremp/resource@2.0/img/other/wave1.png") repeat-x;
    _filter:alpha(opacity=80);
    position:absolute;
    bottom:0;
    width:400%;
    left:750px;
    z-index:5;
    opacity:1;
    transiton-property:opacity,bottom;
    animation:wave1 90s infinite;
    -webkit-animation:wave1 60s infinite;
}
#banner_wave_2 {
    width:auto;
    height:80px;
    background:url("https://cdn.jsdelivr.net/gh/yremp/resource@2.0/img/other/wave2.png") repeat-x;
    _filter:alpha(opacity=80);
    position:absolute;
    bottom:0;
    width:400%;
    left:0;
    z-index:4;
    opacity:1;
    transiton-property:opacity,bottom;
    animation:wave2 90s infinite;
    -webkit-animation:wave2 60s infinite;
 }
}

清除浏览器缓冲,刷新页面就可以看到动态波浪效果了。

# 首页下拉箭头

在 Sakura 主题目录下的 layouts/imgbox.php 文件中最后加上以下代码:

?>
<div class="headertop-down faa-float animated" onclick="headertop_down()"><span><i class="fa fa-chevron-down" aria-hidden="true"></i></span></div>

再往 style.css 文件中加入 CSS 代码:

/* 首页下拉箭头样式 */
.headertop-bar::after {
    content: '';
    width: 150%;
    height: 4.375rem;
    background: #fff;
    left: -25%;
    bottom: -2.875rem;
    border-radius: 100%;
    position: absolute;
    z-index: 4;
}
 
.headertop-down {
    position: absolute;
    bottom: 50px;
    left: 50%;
    cursor: pointer;
    z-index: 5;
}
@media (max-width: 860px) {
    .headertop-down {
        display: none
    }
}
 
.headertop-down i {
    font-size: 28px;
    color: #fff;
    -ms-transform: scale(1.5,1); /* IE 9 */
    -webkit-transform: scale(1.5,1); /* Safari */
    transform: scale(1.5,1); /* Standard syntax */
}

接着还需要在 js/sakura-app.js 文件最后添加下列代码:

/* 首页箭头下拉效果 */
function headertop_down() {
    var coverOffset = $('#content').offset().top;
    $('html,body').animate({
        scrollTop: coverOffset
    },
    600);
}

刷新页面,清理缓存就完成了。

# 看板娘

首先在 footer.php 文件中加入下面的代码:

<script src="https://cdn.jsdelivr.net/gh/yremp/live2d@2.0/autoload.js"></script>

对应原文件的部分代码修改后如下:

刷新后就可以看到博客页面有只看板娘了。

# 樱花飘落

给页面添加樱花飘落的特性非常简单,在上述看板娘代码下面再引入一行代码即可。

<!-- 看板娘 -->
<script src="https://cdn.jsdelivr.net/gh/yremp/live2d@2.0/autoload.js"></script>
<!-- 樱花特效 -->
<script src="https://cdn.jsdelivr.net/gh/yremp/yremp-js@1.5/sakura.js"></script>

# 首页打字机效果

Sakura 主题可以在首页设置一句话,一般可以写句诗来提升自己博客的逼格。

这里找到了网上的教程,可以给诗增加打字效果,使得页面更加灵动。步骤如下:

首先在 Sakura 主题目录下的 layouts/imgbox.php 文件中添加如下代码:

<!-- 首页一言打字效果 -->
<script src="https://cdn.jsdelivr.net/npm/typed.js@2.0.11/lib/typed.min.js"></script>
<div class="header-quote">
    <i class="fa fa-quote-left"></i>
    <span class="element">疯狂读诗中......</span>
    <i class="fa fa-quote-right"></i>
    <span class="element"></span>
</div>
<script>
var typed = new Typed('.element', {
  strings: ["满院东风,海棠铺绣,梨花飘雪", "鹏北海,风朝阳,又携书剑路茫茫","取次花丛懒回顾,半缘修道半缘君"],
  typeSpeed: 140, // 打字速度
  backSpeed: 50, // 回退速度
  loop: true,// 是否循环
  loopCount: Infinity,
  showCursor: true// 是否开启光标
});
</script>

改后的默认字体不是特别好看,所以我修改了 style.css ,具体修改内容如下:

.header-info .header-quote span {
    margin: 0;
    font-family: Ubuntu, sans-serif;
    font-weight: 700
}

其实还有一些边边角角的修改,但是就不记录在这里了,前面的几篇博客基本都有。如果没有,就从博主的历史文章中找找看,一般都会有的。


# WordPress 插件

WordPress 提供了众多便捷实用的插件,极大地提升了使用体验。

Simple Local Avatars :该插件允许用户直接在 WordPress 管理面板上设置个人头像,而无需依赖 Gravatar 服务。由于 Gravatar 在某些地区可能无法正常加载图片,这使得该插件在提升网站美观度方面显得尤为重要。

WP Githuber MD :一个为 WordPress 网站提供全功能 Markdown 语法的插件。WordPress 写文章时是需要使用原生的编辑器的,这有点像 Word,虽然更方便一些。不过,对于用惯了 Markdown 的我来说,原生编辑器还是太难用了,而且我也不想一直打开管理面板写草稿,有一种一不小心就可能丢失的恐惧。这个插件可以提供 Markdown 编辑器服务,非常方便,不够似乎不能引入网络图片,有点难受。


# 一些小问题

# 特色图

Sakura 主题似乎需要对每篇博客都设置一张特色图,否则可能会有报错或其他奇奇怪怪的问题。

这倒也不是什么大问题吧,就是我这 40G 存储的服务器存这么多图片,不知道能不能吃得消。

# 评论区

博客发表后,点开评论区会发现一串 Warning,意思大概是 functions.php 文件中有一个变量没有初始化。

改成下面这样就没事了:

function push_smilies()
{
    global $wpsmiliestrans;
    $return_smiles = ''; // 初始化 $return_smiles 变量
    foreach ($wpsmiliestrans as $k => $v) {
        $Sname = str_replace(":", "", $k);
        $Svalue = $v;
        $return_smiles .= '<span title="' . $Sname . '" onclick="grin(' . "'" . $Sname . "'" . ')"><img src="https://cdn.jsdelivr.net/gh/moezx/cdn@3.1.9/img/Sakura/images/smilies/' . $Svalue . '" /></span>';
    }
    return $return_smiles;
}

# 上下篇

应该是这个主题的作者没有注意到的 bug,就是第一篇博客和最后一篇博客并没有下一篇和上一篇,但 inc/theme_plus.php 代码里似乎没有考虑这个问题,所以会有报错。

找到其中有关上下篇逻辑的代码,并替换成下面的内容即可:

/*
 * 获取相邻文章缩略图
 * 特色图 -> 文章图 -> 首页图
 */
// 上一篇
function get_prev_thumbnail_url() { 
    $prev_post = get_previous_post(); 
    if (!$prev_post) {
        return get_random_bg_url(); // 首页图
    } 
    else if (has_post_thumbnail($prev_post->ID)) { 
        $img_src = wp_get_attachment_image_src(get_post_thumbnail_id($prev_post->ID), 'large'); 
        return $img_src[0]; // 特色图
    } 
    else { 
        $content = $prev_post->post_content; 
        preg_match_all('/<img.*?(?: |\\t|\\r|\\n)?src=[\'"]?(.+?)[\'"]?(?:(?: |\\t|\\r|\\n)+.*?)?>/sim', $content, $strResult, PREG_PATTERN_ORDER); 
        $n = count($strResult[1]); 
        if ($n > 0) { 
            return $strResult[1][0];  // 文章图
        } else {
            return get_random_bg_url(); // 首页图
        } 
    } 
}
// 下一篇
function get_next_thumbnail_url() { 
    $next_post = get_next_post(); 
    if (!$next_post) {
        return get_random_bg_url(); // 首页图
    } 
    else if (has_post_thumbnail($next_post->ID)) { 
        $img_src = wp_get_attachment_image_src(get_post_thumbnail_id($next_post->ID), 'large'); 
        return $img_src[0]; // 特色图
    } 
    else { 
        $content = $next_post->post_content; 
        preg_match_all('/<img.*?(?: |\\t|\\r|\\n)?src=[\'"]?(.+?)[\'"]?(?:(?: |\\t|\\r|\\n)+.*?)?>/sim', $content, $strResult, PREG_PATTERN_ORDER); 
        $n = count($strResult[1]); 
        if ($n > 0) { 
            return $strResult[1][0];  // 文章图
        } else {
            return get_random_bg_url(); // 首页图
        } 
    } 
}