从 WordPress 到 Hugo:我的博客迁移全记录

背景 我的博客建于 2014 年,最初使用 WordPress 搭建。十年来,积累了 282 篇文章,涉及技术笔记、产品评测、行业观察等多个类别。 但随着时间推移,WordPress 的问题越来越明显: 性能瓶颈:每次访问都要查询数据库,响应慢,需要缓存插件维持 维护负担:核心、插件、主题需要频繁更新,安全隐患多 资源消耗:PHP + MySQL 的组合对服务器资源要求较高 备份复杂:需要同时备份数据库和文件,恢复流程繁琐 2026 年初,我决定将博客迁移到 Hugo —— 一个基于 Go 语言的静态网站生成器。 迁移完成后,博客的访问速度提升了 5-10 倍,服务器资源占用降低了 90% 以上。 本文记录了整个迁移过程,希望对有类似需求的朋友有所帮助。 一、为什么选择 Hugo? 在决定迁移之前,我对比了几种主流的静态网站生成器: 工具 优点 缺点 Hugo 极快(毫秒级构建)、Go 原生、主题丰富 模板语法需要学习 Jekyll GitHub 原生支持、生态成熟 Ruby 依赖、构建较慢 Hexo 中文社区活跃、上手简单 Node.js 依赖、插件质量参差 Astro 现代化、支持多框架 相对较新、迁移资源少 最终选择 Hugo 的原因: 构建速度:282 篇文章的构建时间不到 5 秒 单文件部署:Hugo 是一个独立二进制文件,无需安装依赖 主题生态:PaperMod、Stack 等主题现代且维护活跃 迁移工具:社区有成熟的 WordPress 转 Hugo 方案 二、迁移方案设计 2.1 迁移流程概览 WordPress (MySQL) ↓ 导出 WXR XML(WordPress 导出工具) ↓ PHP 转换脚本(自定义 wp2hugo.php) ↓ Hugo Markdown 文件 ↓ Hugo 构建 ↓ 静态 HTML(Nginx 托管) 2.2 关键决策 决策一:使用 PHP 转换而非现成工具 ...

2026年2月22日 · 4 分钟

本小站正式从阿里云迁往华为云

本站在阿里云ECS已经有5年之久了,1C2G的配置,1M带宽 外加20G云盘,一年要耗费1100多大洋~~。随着云化技术的发展,一直等着阿里能有优惠,然而一直都如此。 碰巧前段时间看到华为云的优惠活动。新注册用户 2C4G的HECS 3年只要700多。瞬间心动,直接买了。 前段时间增加了域名备案,但是一直没有机会把主机迁移。 今晚早下班,一并做了迁移。同时把好久没升级的nginx和php都升级到了最新版本 华为云 棒棒的^_^

2020年7月17日 · 1 分钟

如何安全升级wordpress

第一步:备份 如果真到了升级后一团糟的底部,有了备份的数据,还可以重头再来。 备份分两部分: 第一部分是代码备份,对整个根目录打包存放到安全的位置 tar zcvf backup_dir/backup_20160124.tar.gz /home/wordpress/html 第二部分是数据库备份 mysqldump -u username -ppassword yourdatabase > backup_20160124.sql 第二步:本地环境搭建 在本地机器上搭建一套apache+php+mysql系统。在windows机器上,可以直接安装个省事的WAMP(Windows+APACHE+MYSQL+PHP)。 然后把备份的数据库导入到本地的机器,把备份的代码解压到apache的工作目录。 设置本地hosts,举例: 127.0.0.1 zhaoyanblog.com 浏览器访问http://zhaoyanblog.com 就是访问的本地环境。 第三步:wordpress升级演练 wordpress升级有两种形式: 一种是通过wordpress的管理后台进行升级。 另外一种是把wordpress最新安装包下载下来,把其中的wp-content删除,然后用其覆盖当前的代码。 然后访问http://zhaoyanblog.com/wp-admin/upgrade.php进行其它升级(比如数据库数据)。 最后访问本地http://zhaoyanblog.com,确认升级是否有问题。 第四步:正式环境升级 当本地升级没有问题之后,把在本地的升级步骤,再实施到正式的环境即可。 最后说一句 wordpress好多版本是为了解决老版本中的安全问题,所以时间长了wordpress的版本升级还是很有必要的。

2016年1月24日 · 1 分钟

博客适配移动浏览器

博客使用了wordpress,虽然大部分wordpress的主题都是响应式布局,也就是随着客户端屏幕大小,语言进行自由适配,但是总是不完美的。 用wordpress,首先想到的就是用插件解决这个问题。发现wptouch这款插件的页面是最舒服的一款适配移动的插件。 wptouch是专门用来解决wordpress的移动端浏览的问题,它有自己专门的主题。功能强大。 wptouch只提供基础的功能,强大的主题功能需要付费升级到pro版本。 当然wordpress适配移动端,还有其它方式,举例说: 安装专门的移动主题,然后使用wordpress-mobile-theme-switcher等插件,根据User-agent进行动态主题切换。

2016年1月17日 · 1 分钟

谨防黑客攻击wordpress的xmlrpc.php

最近两天随便瞟了两眼机器的负载,发现飙升到了0.6了,我的博客一向访问人很少,即便是1CPU1G的配置,负载也不会这么高的。仔细看了apache的access日志。发现大量的访问xmlrpc.php的请求。 167.114.89.173 - - [22/Nov/2015:04:52:29 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 192.99.196.123 - - [22/Nov/2015:04:52:33 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 192.99.196.123 - - [22/Nov/2015:04:52:39 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.173 - - [22/Nov/2015:04:52:41 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.173 - - [22/Nov/2015:04:52:49 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.168 - - [22/Nov/2015:04:52:49 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 192.99.196.123 - - [22/Nov/2015:04:52:51 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 192.99.196.123 - - [22/Nov/2015:04:52:58 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.168 - - [22/Nov/2015:04:52:58 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.168 - - [22/Nov/2015:04:52:58 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.173 - - [22/Nov/2015:04:53:04 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.173 - - [22/Nov/2015:04:53:07 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 之前也看到过类似的请求,第一眼看到User-Agent包含Googlebot/2.1,http://www.google.com/bot.html等关键字,以为是google的爬虫,没有太留意。今天仔细看了下,发现并非如此,这样的访问是大量连续存在的,而且存在多个ip地址。都是POST请求到xmlrpc.php。抓包看内容完全一样的。百度下ip大都是芬兰啊,加拿大等国外的,也没有迹象表明是google的ip。google爬虫也应该不是这样的行为,所以果断屏蔽。之前使用虚拟机,只能在apache和php层。这次使用的独立主机,最直接的的方式就是在防火墙上屏蔽它们。 ...

2015年11月22日 · 2 分钟

写个定时任务每天向百度提交新链接

百度蜘蛛的爬行是有周期性的,你当天写的文章,百度可能几天后才会收集到。为了让百度早点收录新写的文章,我们可以向百度主动提交当天的新链接,百度站长可以每个月主动提交500个链接。 首先写个脚本push.sh #!/bin/sh CURRENT_DIR=$(dirname "$0") MYSQL_USERNAME="xxxxxx" MYSQL_PASSWORD="xxxxxxxx" MYSQL_DATABASE="xxxxxxx" MYSQL_CMD="/usr/bin/mysql" #百度链接提交地址,在百度站长里可以找到 BAIDU_COMMIT_URL="http://data.zz.baidu.com/urls?site=zhaoyanblog.com&token=xxxxxxx" #找出今天所有发布的文章,post类型代码文章,publish状态表示发布状态的,排除草稿。 today=`date "+%Y-%m-%d 00:00:00"` ids=`$MYSQL_CMD -N -u $MYSQL_USERNAME -p$MYSQL_PASSWORD $MYSQL_DATABASE -e "select ID from wp_posts where post_type='post' and post_status='publish' and post_date>'${today}';"` if [ ! -n "$ids" ]; then exit; fi #把文章地址输出到一个临时文件里 cd $CURRENT_DIR rm -rf urls.txt for id in $ids; do echo "http://zhaoyanblog.com/archives/$id.html" >> urls.txt; done #提交给百度 curl -H 'Content-Type:text/plain' --data-binary @urls.txt "$BAIDU_COMMIT_URL" 然后在crontab里添加定时任务,每天晚上11点50执行: 50 23 * * * /bin/sh /home/zhaoyanblog/push/push.sh 2>&1 1»/home/zhaoyanblog/push/push.log

2015年9月30日 · 1 分钟

赵岩的博客正式加入公益404页面

写博客,写的不好的时候,就想删除,目录结构设计的不合理,就想更改。但是有一些网页已经被百度等搜索引擎收录了。用户访问的时候就会显示404页面,表示页面不存在。 在过去,网站通常的做法是把404页面写上友好的提示语,或者随机显示一则笑话,甚至是直接跳转到主页。 现在有很多大型的网站,像百度、腾讯等都已经把404页面改为公益广告,特别是寻找丢失儿童的广告。例如腾讯公司内部员工志愿者就发起了这样一起互联网公益活动,建议站长博主在自己的404页面中嵌入一段简单的代码,就能通过互联网来迅速传播失踪儿童信息,从而提高找回失踪儿童的概率。 我认为这是个好主意,从今天开始,赵岩的博客正式加入公益404页面,打开不存在的页面都会跳转到公益寻人广告页面。 比如:http://zhaoyanblog.com/404.html

2015年6月28日 · 1 分钟

最近对wordpress的优化

第一:去掉一些不用的html head内容,让页面更小 在function.php中加入: remove_action( ‘wp_head’, ‘wp_generator’); remove_action( ‘wp_head’, ‘wlwmanifest_link’); remove_action( ‘wp_head’, ‘rsd_link’); remove_action( ‘wp_head’, ‘index_rel_link’ ); remove_action( ‘wp_head’, ‘parent_post_rel_link’, 10, 0 ); remove_action( ‘wp_head’, ‘start_post_rel_link’, 10, 0 ); remove_action( ‘wp_head’, ‘adjacent_posts_rel_link_wp_head’, 10, 0 ); remove_action( ‘wp_head’, ‘feed_links’, 2 ); remove_action( ‘wp_head’, ‘feed_links_extra’, 3 ); remove_action( ‘wp_head’, ‘wp_print_head_scripts’, 9 ); remove_action( ‘wp_head’, ‘rel_canonical’ ); remove_action( ‘wp_head’, ‘wp_shortlink_wp_head’, 10, 0 ); 第二:去掉一些定时任务,这些定时任务会频繁访问数据库和网络 在function.php中加入: remove_action( ‘init’, ‘wp_schedule_update_checks’ ); remove_action( ’load-plugins.php’, ‘wp_update_plugins’ ); remove_action( ’load-themes.php’, ‘wp_update_themes’ ); remove_action( ’load-update-core.php’, ‘wp_update_plugins’ ); remove_action( ’load-update-core.php’, ‘wp_update_themes’ ); remove_action( ’load-update.php’, ‘wp_update_plugins’ ); remove_action( ’load-update.php’, ‘wp_update_themes’ ); remove_action( ‘upgrader_process_complete’, ‘wp_update_plugins’ ); remove_action( ‘upgrader_process_complete’, ‘wp_update_themes’ ); remove_action( ‘upgrader_process_complete’, ‘wp_version_check’ ); remove_action( ‘wp_maybe_auto_update’, ‘wp_maybe_auto_update’ ); remove_action( ‘wp_update_plugins’, ‘wp_update_plugins’ ); remove_action( ‘wp_update_themes’, ‘wp_update_themes’ ); remove_action( ‘wp_version_check’, ‘wp_version_check’ ); ...

2015年5月27日 · 1 分钟

博客正式迁入阿里云ECS

从今日起,我的博客正式迁入阿里云ECS服务器了。之前是用的西部数码west263的虚拟机。图的就是便宜。便宜没好货,服务器三天两头的出故障。 这是dnspod的部分监控信息: zhaoyanblog.com johnyannj.gotoip2.com. 01-29 17:21 01-29 17:39 17分钟 53秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-23 23:41 01-23 23:51 10分钟 27秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-21 01:01 01-21 01:05 4分钟 30秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-16 18:25 01-16 18:54 28分钟 29秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-12 11:05 01-12 11:24 19分钟 19秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-12 02:57 01-12 07:40 4小时 43分钟 52秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-11 20:50 01-11 21:14 24分钟 3秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-11 15:52 01-11 16:13 21分钟 5秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-11 11:51 01-11 12:08 16分钟 31秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-11 05:55 01-11 07:49 1小时 54分钟 6秒 ...

2015年5月17日 · 1 分钟

有了自己域名的专属邮箱

从今天开始,本站长就有了自己的专属邮箱了zhaoyan@zhaoyanblog.com。因为是买了万网的域名,赠送的10G企业邮箱,一直没有用。现在用起来了。以后再也不用担心垃圾广告了。 如果你看到我的博客,有什么疑问,或者发现不对的地方,欢迎你给我发邮件,或者微博给我留言一起交流技术问题。

2015年4月10日 · 1 分钟

防止垃圾评论的有效方法还是验证码

本博客在上线之初,就受垃圾评论的骚扰,有一种wordpress评论机器人,每天都自动寻找wordpress站点,进行自动评论,每天都收到大量这样的垃圾评论: 我不想关闭评论功能,或者是只允许注册之后评论,因为我自己的博客,没必要,我也不想开放注册功能的。我一开始的解决方法是屏蔽这些IP,见文章:《如何屏蔽恶意访问IP》 可是屏蔽了一部分IP,过几天又有新的ip出现。目前已经屏蔽了数个IP段: 199.30.24.* 199.30.25.* 112.111.189.* 112.111.191.* 112.111.184.* 但是老是这样屏蔽也不是办法,有可能把正常用户的ip给屏蔽了。今天才想到了这个问题,在防止垃圾评论上,屏蔽IP太不专业了,垃圾评论是机器人所为,而在计算机的世界里,验证码才是自动区分计算机和人类行为的专业行为。 好了,搜索CAPTCHA,安装一个验证码wordpress插件,设置一下,ok了,再也不用担心垃圾评论的问题了。

2015年1月21日 · 1 分钟

媳妇熬成婆,本网站在百度也有了站点信息

今日早上习惯性的在百度site了一下自己的网站,惊喜的发现本站在百度也有站点信息了,截图如下: 不仅仅如此,另外一个小站也有了站点信息: 众所周知,百度推出site显示一个站点的备案等信息的功能,也就几个月时间,应该是为了识别出稳定可靠,有价值,健康的网站,以便把那些临时的,违法的网站剔除掉。在之初只有大型的门户网站以及一些出名的网站才会显示站点信息,慢慢扩大范围,据猜测,只有建站年限、收录量、访问量等一些参数满足了百度的相关条件才会被收录。 本站建站有一年有余,虽然不是每天都有更新,但也是持续到现在,本站百度收录量从只收录首先到现在三四百页,访问量从个位数的PV发展到每天近200PV,我想这是让百度信任的首要条件,其次就是本站从建站初期就使用百度统计、后来加入了百度联盟广告,这也是贴近百度的一种方式,我的第二个站也被百度显示了站点信息,但是访问量并不大,想想可能就是用了百度统计,百度联盟广告的原因,或者是沾了第一个网站的光了。 写博客是我的个人爱好,也是为了分享,博客被更多的人看到,总是高兴的,谢谢大家浏览我的博客,也希望其中的内容能对你所帮助。

2015年1月10日 · 1 分钟

千万不要自己点百度联盟的广告

因为流量有限,没有人点击我的广告,我这几天每天晚上都自己点下百度联盟的广告,每次点之前都清空cookie,自以为神不知鬼不觉,每天也有几块钱的广告收入。最终还是被百度联盟发现了,今天偶现发现了百度站内信,我的信誉等级从三颗星变为了一颗星,一颗星表示:“信誉修正期-会员存在大量的作弊违规行为,严重违反了百度联盟业务合作规范,信誉表现急需修正”。庆幸自己发现的及时,否则早被百度联盟踢出局了。 所以只有提高自己的页面质量,多发原创内容,提升网站流量,吸引自然用户点击才是王道。以后每天我再也不点击自己的广告了,默默的耕耘我的小网站,希望早日经过百度联盟的考察期。 战友们如果你也使用了百度联盟的广告,千万不要自己点百度联盟的广告,否则后悔的是你自己。谨记我这个惨痛的经历啊。

2014年9月18日 · 1 分钟

目录调整如何不影响百度收录

因为历史原因,我的文章分类和标签url分别设成了下面这样子 http://zhaoyanblog.com/archives/category/website http://zhaoyanblog.com/archives/tag/angularjs 显然是不怎么简洁的,我现在要调整成 http://zhaoyanblog.com/category/website http://zhaoyanblog.com/tag/angularjs 但是目前我的博客已经被百度收录了,这么一改的话,肯定会出现大批收录的url为死链,返回404。 百度站长平台提供了一个“网站改版”改版的功能。你可以提交要改版的目录 例如:http://zhaoyanblog.com/archives/tag 表示原来这些路径下面的url都改版了。 但是前提是,原来的url要使用301跳转指向对应的新url,百度会在一个月时间内更新索引。301跳转就是http的状态码,表示永久跳转。并告诉浏览器一个新的地址,浏览器自动完成页面跳转。 要实现301跳转,还要使用.htaccess文件,在里面加入下面的话: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^zhaoyanblog.com$ RewriteRule ^archives/category/(.)$ category/$1 [R=301,L] RewriteRule ^archives/tag/(.)$ tag/$1 [R=301,L] </IfModule> 注意,如果你有多个重写<IfModule mod_rewrite.c>,它们之间是有执行顺序的,其中一个是伪静态url,就是把archives/category/website 这样的路径,当做参数传递给index.php,伪静态url的目的就是利于SEO。这个我在《SEO我做了哪些优化》中有说过。 所以这个301跳转必须发生在,伪静态url那个<IfModule mod_rewrite.c>前面。 写好之后,这样就设定好了301跳转。 设定好了之后,我发现我的一些中文tag有点问题,例如 访问:http://zhaoyanblog.com/archives/tag/勇敢做自己。 返回301跳转到了 http://zhaoyanblog.com/tag/%D3%C2%B8%D2%D7%F6%D7%D4%BC%BA 还是返回404. 原因是我的网站使用的是utf-8编码,而我使用的apache服务使用了GBK编码 例如上方“%D3%C2%B8%D2%D7%F6%D7%D4%BC%BA”是“勇敢做自己”的GBK编码。 所以要修改apache的url编码格式为utf-8。这样中文跳转就没问题了: http://zhaoyanblog.com/tag/%E5%8B%87%E6%95%A2%E5%81%9A%E8%87%AA%E5%B7%B1 我使用的西部数码的虚拟机提供了修改服务器url编码这样的选项,如果你直接自己搭建的apache或者nginx服务器,如果有上面的问题,可能需要自己修改相关的配置了。

2014年7月16日 · 1 分钟

[惊喜]百度广告从基础升通用了

从建站伊始我就加入了百度联盟,加入百度联盟门槛不高: 1、有内容,你的网站必须有一定的内容,合法的。如果你刚刚建站,就几篇文章可能会申请失败,你需要充实之后再次申请。 2、有备案,如果你是个国内网站你必须有备案,不过如果你是香港主机或者境外网站的就不需要了。 满足这两个条件就可以在百度联盟网站注册一个用户,中间要验证下自己的网站。就可以投放自己的广告了。 你的网站有两个等级:基础和通用。如果你的网站流量很大,或者内容很丰富,上来审核员可能就给你一个通用级别。那下面的问题就不需要看了。 如果你的网站流量不是很大,内容还不怎么丰富,那你就是基础级别,然后你无论投放的什么百度广告,都是显示的主题广告。主题广告的原理很简单,就是百度联盟广告js,会从你投放广告的页面抓取内容,提取关键字以链接显示出来,用户点击你的主题链接,就会进入围绕这个主题的百度广告页面。这样单调的广告,肯定让你的网站看着很丑陋。 为此我们要努力从基础变成通用,变成通用的条件,一是流量,而是内容,像一个网站的流量基本来源于搜索引擎,所以最终还是要从内容着手,主要从以下几方面 第一:虽然联盟广告,你目前只能做主题广告,但是你也要多加几个,增加展现量。 第二:百度联盟和百度统计是相通的,我相信百度联盟的广告统计展现量是用了百度统计的相关技术,或者是数据有共享,你的网站要加入百度统计代码,不要用cnzz的。 第三:你的网站一定要主题明确,因为百度联盟的广告原理就是根据你的网站内容推送相近内容的广告,所以你一定要围绕一个主题充实你的网站。这就是SEO的话题了,关于SEO其它方面的建议,你可以参考我的《SEO我做了哪些优化》《SEO我做了哪些优化(续)》,或者其它网站的资料。 第四:最重要的还是坚持每天更新原创内容。我就是每天都坚持更新一篇自己原创的文章,最终从基础变成通用的,虽然我的每天的网站流量不是很大。我想我只所以从基础变成通用,是因为百度联盟检测到我的内容原创度高,内容丰富了。百度搜素检测文章是否远程的算法还是有一套的,我发现我之前关于《java多线程学习》的几篇总结,一直没有被收录,这是因为关于这方面的内容,网上实在太多了。你的内容是否原创度高,百度搜索索引量是个间接的反映。

2014年7月7日 · 1 分钟