Blog 的部分优化

前言

在自己访问自己的 Blog 时,发现了一些问题:比如 API 被阻断、头像获取慢等。想写一篇文章,将问题和解决方案记下来。

*待后续更新*

反向代理 Gravatar

偶然间清理了缓存,发现访问自己的博客加载了很久。检查后才发现,访问 cn.gravatar.com 获取头像就花费了24 秒。于是想用 Nginx 反向代理 gravatar,来提高速度。

配置文件如下:

server {
    listen 443;
    server_name gravatar.konekomoe.com;

    location / {
        proxy_pass https://gravatar.com/;
    }

    # 证书相关设置,此处省略
}

nginx -s reload 后访问 gravatar.konekomoe.com/avatar 即可获取头像。

之后发现 Kratos 的主题设置可以直接更换 Gravatar 地址,更换后解决问题。

API 被阻断

主题原作者的 api.fczbl.vip 疑似被阻断了一段时间,无法访问。出于稳定性考虑,打算现学现卖边 Google 边用 PHP 将部分 API 重写

注意红字,只看了 PHP 的一部分基础就开始写了,所以看看就行(逃

hitokoto

<?php
header("Access-Control-Allow-Origin: *");
$file = file(__DIR__ . "/hitokoto.txt");
$lineNum = mt_rand(0, count($file) - 1);
$koto = trim($file[$lineNum]);
if ($_GET['encode'] == 'js') {
    $koto = "function hitokoto(){document.write('" . $koto . "');}";
} else if ($_GET['encode'] == 'json') {
    $koto = json_encode(array("hitokoto" => $koto));
}
echo $koto;
?>

(现在达到了勉强能用的水平(逃))

*待补充*

状态

主题自带一个“状态”,我也比较想发一些自己干的事情或者心情等。不过,状态是和首页的文章混合在一起的,看起来并不是十分好看。一番寻找,找到了 add_filter() 这个函数。按照案例一顿操作,在主题的 functions.php 中添加一段代码,首页和文章归档都不会显示状态了。之后在菜单里添加了“分类目录”,放在“状态”中。代码如下:

// exclude status from home page.
function exclude_status($query) {
if ($query->is_home()) {
// array is the category's id to exclude.
$query->set('category__not_in', array(20));
    }
}
add_filter('pre_get_posts', 'exclude_status');

此外,感觉原作者写的状态不是很符合我的审美,于是把 CSS 瞎改了一通。

之后又发现一个新的问题:sitemap.xml 和 sitemap.html 里面都有关于状态的文章。但是,不想让这些状态出现在 sitemap 里,毕竟不是真正的文章。一番寻找,发现主题作者是把 mk-sitemap 整合在了 inc/core.php 里面。修改几处 PHP 的代码,从 sitemap 中删除了状态。不过,每个状态的标题必须以“状态-”开头,链接必须以"/status_xx/"结尾。

foreach($posts as $post): 
    $yusoId = get_permalink($post->ID);
    if (strpos($yusoId, "status_") !== false): 
        continue;
    endif; ?>
    <url>
        <loc><?php echo $yusoId; ?></loc>
// other code
<?php foreach ($posts as $post):
    $title = $post->post_title;
    $title = htmlspecialchars_decode($title, ENT_QUOTES);
    if (strpos($title, "状态-") !== false):
        continue;
    endif; ?>
// other code

现在还有个问题:搜索引擎可能会收录这些状态,但是我觉得没有必要。这时候就用到 robots.txt 了。在里面加入一行:

Disallow: /status_*/

即可解决问题。

参考文章

https://developer.wordpress.org/reference/functions/add_filter/

https://developer.wordpress.org/reference/functions/is_main_query/

https://developer.wordpress.org/reference/hooks/pre_get_posts/

https://www.runoob.com/php/php-string.html

https://baijunyao.com/article/56

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注