wordpress更换域名

① 准备工作

  • 备份 MySQL 数据库
  • 将新域名绑定到服务器,添加证书、伪静态规则等;

② 更换域名

  1. 复制整个 WordPress 目录到新域名的网站目录
  2. 导出 MySQL
  3. 修改数据库中的域名:

执行 SQL(一次搞定):

UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name='siteurl';
UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name='home';

如涉及文章里的旧域名,还需替换:

UPDATE wp_posts SET post_content = REPLACE(post_content, 'https://旧域名', 'https://新域名');
UPDATE wp_posts SET guid = REPLACE(guid, 'https://旧域名', 'https://新域名');

将wordpress从简体中文转为繁体中文

一个特殊的需求,将一个wordpress网站从简体中文换成繁体中文。

在wordpress后台可以更换wordpress语言为繁体中文,但是文章标题、文章内容、分类、标签等等,转化起来就比较麻烦,尝试过几款wordpress插件,都不太好用,最后还是借助强大的OpenCC来实现,以下是步骤:

一、备份数据库

非常重要,一定要先备份原数据库。

二、安装opencc

apt install opencc -y

三、将下面脚本保存为convert_zh_tw_all.sh:

#!/bin/bash
set -e

DB_NAME="dbname"
DB_USER="dbuser"
DB_PASS="你的数据库密码"
TABLE_PREFIX="wp_"

BACKUP_FILE="backup_zhcn_to_zhtw_$(date +%F_%H%M%S).sql"

echo "=== [1] 备份数据库:$BACKUP_FILE ==="
mysqldump -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" > "$BACKUP_FILE"
echo "[OK] 数据库已备份"

echo "=== [2] 导出 wp_posts 内容 ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
  -e "SELECT ID, post_title, post_content, post_excerpt FROM ${TABLE_PREFIX}posts;" > posts.tsv

echo "=== [3] 导出 wp_terms(分类/标签名称) ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
  -e "SELECT term_id, name FROM ${TABLE_PREFIX}terms;" > terms.tsv

echo "=== [4] 导出 wp_term_taxonomy(分类/标签描述) ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
  -e "SELECT term_taxonomy_id, description FROM ${TABLE_PREFIX}term_taxonomy;" > term_taxonomy.tsv

echo "=== [5] 使用 OpenCC 将 TSV 转换为繁体 ==="
opencc -i posts.tsv -o posts_tw.tsv -c s2t.json
opencc -i terms.tsv -o terms_tw.tsv -c s2t.json
opencc -i term_taxonomy.tsv -o term_taxonomy_tw.tsv -c s2t.json

echo "=== [6] 生成 SQL 更新脚本(正确处理换行符) ==="
php << 'EOF'
<?php

function escape_mysql($str) {
    // 保留真实换行,不转换为 \n 字面符号
    $str = str_replace("\\", "\\\\", $str);   // 转义反斜杠
    $str = str_replace("'", "\\'", $str);     // 转义单引号
    return $str;
}

# ---------------------------
# posts
# ---------------------------
$fp = fopen("posts_tw.tsv", "r");
$out = fopen("update_posts.sql", "w");
fgets($fp); // 跳过表头

while (($line = fgets($fp)) !== false) {
    $cols = explode("\t", $line, 4);
    if (count($cols) < 4) continue;

    list($id, $title, $content, $excerpt) = $cols;

    $id = intval($id);
    $title = escape_mysql($title);
    $content = escape_mysql($content);
    $excerpt = escape_mysql($excerpt);

    fwrite($out, "UPDATE wp_posts SET post_title='$title', post_content='$content', post_excerpt='$excerpt' WHERE ID=$id;\n");
}
fclose($fp);
fclose($out);


# ---------------------------
# terms
# ---------------------------
$fp = fopen("terms_tw.tsv", "r");
$out = fopen("update_terms.sql", "w");
fgets($fp);

while (($line = fgets($fp)) !== false) {
    $cols = explode("\t", $line, 2);
    if (count($cols) < 2) continue;

    $id = intval($cols[0]);
    $name = escape_mysql($cols[1]);

    fwrite($out, "UPDATE wp_terms SET name='$name' WHERE term_id=$id;\n");
}
fclose($fp);
fclose($out);


# ---------------------------
# term_taxonomy
# ---------------------------
$fp = fopen("term_taxonomy_tw.tsv", "r");
$out = fopen("update_term_taxonomy.sql", "w");
fgets($fp);

while (($line = fgets($fp)) !== false) {
    $cols = explode("\t", $line, 2);
    if (count($cols) < 2) continue;

    $id = intval($cols[0]);
    $desc = escape_mysql($cols[1]);

    fwrite($out, "UPDATE wp_term_taxonomy SET description='$desc' WHERE term_taxonomy_id=$id;\n");
}
fclose($fp);
fclose($out);

echo "[OK] SQL 文件生成完成\n";
?>
EOF

echo "=== [7] 执行 SQL ==="
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_posts.sql
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_terms.sql
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_term_taxonomy.sql

echo "=== ✔✔✔ 全部内容成功转换为繁体中文(不破坏 slug,不破坏格式) ==="
echo "备份文件:$BACKUP_FILE"
chmod +x convert_zh_tw_all.sh
./convert_zh_tw_all.sh

如果报错:

-bash: ./convert_zh_tw_all.sh: /bin/bash^M: bad interpreter: No such file or directory

这是因为脚本 在 Windows 编辑过 → 文件里带有 CRLF(\r\n)
Linux 解析 shebang 时把 ^M(\r)当成一部分,导致的,直接把脚本转换成 Linux 格式。

先安装dos2unix:

apt install dos2unix
dos2unix convert_zh_tw_all.sh

记录Adsense遇到的一些问题

只用作记录,便于后期网站/app及AdSense账户的规划。

添加网站审核被拒

点击Adsense – Sites – 具体网站,可以看到给出的理由:

Make sure your site follows the AdSense Program Policies. After you’ve fixed the violation, you can request a review of your site.

Low value content

Your site does not yet meet the criteria of use in the Google publisher network. For more information, review the following resources:

被禁投广告

给出的理由会有各种不同的,其中有一段我举得值得琢磨琢磨:

此外,您也可以从网站中移除所有广告代码。移除所有广告代码意味着您选择不展示广告,因此也无需申请审核。日后只要恢复广告代码,并解决所有违规问题,您就可以申请对您的网站进行审核。在移除广告代码的 7 至 10 天后,政策中心便不会再显示政策方面的问题,但这些问题仍会保留在我们的系统中。

最后,是Adsense最近更新的一个收款政策:

通过 PayPal Hyperwallet 收款

Hyperwallet 是 PayPal 的一项服务,可让您将 AdSense 和 AdSense YouTube 广告收入存入 PayPal Hyperwallet 账号。PayPal Hyperwallet 提供多种收款方式,包括 PayPal、取现和其他本地支付方式。

该方式适用于阿根廷、中国和美国的所有发布商。

具体链接:https://support.google.com/adsense/answer/15292512?hl=zh-Hans

HE+WARP实现全球落地IP

众所周知现在WARP可以解锁大部分地区的流媒体。但是,WARP已经不能指定目的地区了,所以要实现免落地鸡异地解锁流媒体,除了Cloudflare这个互联网大善人,还需要另外一个互联网大善人HE.NET的帮助,以实现异地解锁。

原理A:HE.NET提供的免费IPV6隧道tunnelbroker.net,可以指定IPV6地址的地理区域(注册账户所在国家/地区)。

原理B:HE.NET会通告Maxmind更改IPV6的Geo Location。

原理C:Cloudflare Warp使用的是Maxmind的数据库。

以下是步骤记录:

一、在tunnelbroker.net注册个账号,然后创建IPv6隧道

二、配置IPv6

如果原vps有IPv6,需要先删除掉:

ip a

输出中会显示类似内容:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet6 240e:3a0:abcd:1234::2/64 scope global dynamic
       valid_lft 2592000sec preferred_lft 604800sec
    inet6 fe80::5054:ff:fe12:3456/64 scope link
       valid_lft forever preferred_lft forever

删除某个 IPv6 地址:

sudo ip addr del <IPv6地址>/<前缀长度> dev <网卡名>

示例:

sudo ip addr del 240e:3a0:abcd:1234::2/64 dev eth0

新增一个网络配置文件:

vim /etc/network/interfaces.d/ipv6.conf 

最后的文件名随便取,.conf结尾就行

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:470:aaaa:bbbb::2
        netmask 64
        endpoint 216.218.221.6
        local 11.22.33.44
        ttl 255
        gateway 2001:470:aaaa:bbbb::1

重启网络服务让配置生效:

ifdown he-ipv6 2>/dev/null
ifup he-ipv6

或者重启网络:

systemctl restart networking

再运行ip a应该就能看到添加的HE IPv6。

如果重启网络服务报错“ifup: unknown interface he-ipv6”

执行:

grep interfaces.d /etc/network/interfaces

正常输出应包含:

source /etc/network/interfaces.d/*

如果没有,就要手动加上这行:

echo "source /etc/network/interfaces.d/*" | sudo tee -a /etc/network/interfaces

如果系统使用的是 Netplan(Ubuntu 18.04+ 常见),那 interfaces.d 不会生效,你需要改用 /etc/netplan/ 下的配置。

sudo nano /etc/netplan/99-he-ipv6.yaml

内容如下(用你的参数替换):

network:
  version: 2
  tunnels:
    he-ipv6:
      mode: sit
      local: 10.0.0.28
      remote: 216.218.221.6
      addresses: [2001:470:18:8d0::2/64]
      gateway6: 2001:470:18:8d0::1
      ttl: 255

保存后执行:

sudo netplan apply

再次ip a 查看。

三、安装WARP脚本

项目地址:https://gitlab.com/fscarmen/warp

直接双栈都改成WARP IP,但是一般情况下,WARP脚本都是通过默认的IPV4去连接WARP的Endpoint的,所以VPS A的IPV4是香港IP,获取到的WARP IP也是香港的,不是我们想要的。所以,先输入warp o关闭WARP。

修改WARP的配置文件:

vim /etc/wireguard/warp.conf

把里面[Peer]段里面的Endpoint那行用#注释掉或者删掉。
重新输入新的IPV6的Endpoint。比如:

Endpoint = [2606:4700:d0::a29f:c001]:2408

或者用工具 https://github.com/peanut996/CloudflareWarpSpeedTest 扫描IPv6地址。

重新warp o启用WARP,这时候应该会显示已经连上WARP,并且是你所期待的落地国家(区域)。

也可以借助s-ui来获取warp IP:

四、关于MTU

MTU (Maximum Transmission Unit) = 最大传输单元。

指网络接口一次能传输的最大数据包大小(单位:字节)。可以理解为”数据传输时每个包裹的最大尺寸”。

MTU 的作用

  1. 影响传输效率
    • MTU 太小:数据会被拆分成更多小包,增加开销
    • MTU 太大:可能超过网络支持的大小,导致数据包被丢弃或重新分片
  2. 在 WireGuard/WARP 中的重要性
    • WireGuard 会添加额外的加密头部(约 80 字节)
    • 如果 MTU 设置不当,会导致:
      • 连接不稳定
      • 网页加载缓慢或失败
      • 部分网站无法访问
      • 丢包率高

所以一般可以设置为1400,如果遇到网页加载不完整、HTTPS 连接经常超时、某些网站无法访问、丢包率高,可以尝试:1400138013601280(逐步降低测试)。

继续阅读

Debian部署Go项目记录

第一步:GO部署及环境配置

1、下载 Go: 访问 Go 官方下载页面,选择最新的 Linux 版本。例如:

# 检查最新版本,替换下面的文件名
wget https://go.dev/dl/go1.21.3.linux-amd64.tar.gz

2、解压 Go:

# 删除旧的(如果有)
sudo rm -rf /usr/local/go
# 解压到 /usr/local
sudo tar -C /usr/local -xzf go1.21.3.linux-amd64.tar.gz

3、配置环境变量: 编辑您的 ~/.bashrc 或 ~/.profile 文件:

nano ~/.bashrc

在文件末尾添加:

export PATH=$PATH:/usr/local/go/bin

使其生效:

source ~/.bashrc

4、验证安装:

go version
# 应输出类似: go version go1.21.3 linux/amd64

第二步:准备和编译代码

1、创建项目目录:

mkdir ~/auth-service
cd ~/auth-service

2、初始化 Go 模块:

go mod init auth-service

3、创建 Go 代码文件: 使用 nano main.go 创建文件,然后将下面完整的代码粘贴进去。

package main

import (
	"crypto/md5"
	"encoding/base64"
...

4、下载依赖:

go mod tidy
# 这会自动下载 github.com/gin-gonic/gin

5、编译:

# -ldflags "-s -w" 是可选的,它会减小编译后的文件大小
# CGO_ENABLED=0 确保静态编译,不依赖C库
CGO_ENABLED=0 GOOS=linux go build -a -ldflags "-s -w" -o auth-service main.go

执行完毕后,您会得到一个名为 auth-service 的可执行文件。

第三步:运行和持久化部署

1、测试运行: 您可以先在前台运行测试一下:

./auth-service
# 应输出: Starting auth service on :8080

2、使用 systemd 持久化运行 (推荐): 为了让服务在后台运行,并在服务器重启后自动启动,我们使用 systemd。

1)创建 systemd 服务文件:

sudo nano /etc/systemd/system/auth-service.service

2)粘贴以下内容: (重要: User 和 ExecStart 中的路径需要根据您的实际情况修改:

[Unit]
Description=Go Authentication Service
After=network.target

[Service]
# 替换为您运行此服务的用户名 (例如 www-data 或您的用户名)
User=root 
# 替换为您的 auth-service 文件的绝对路径
ExecStart=/root/auth-service/auth-service 
# 替换为您的工作目录
WorkingDirectory=/root/auth-service 

Restart=always
RestartSec=3
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

3、启动服务:

sudo systemctl daemon-reload        # 重新加载配置
sudo systemctl enable auth-service  # 设置开机自启
sudo systemctl start auth-service   # 立即启动

4、检查服务状态:

sudo systemctl status auth-service

应该能看到它显示 active (running)。

最后:

如果修改了main.go文件,需要重新编译,并且重启服务:

CGO_ENABLED=0 GOOS=linux go build -a -ldflags "-s -w" -o auth-service main.go
sudo systemctl restart auth-service
sudo systemctl status auth-service