日志
- 2022-12-08:教程中增加
post_metadata
不可以为空值的提醒;更新了m2w v2.2.4
,在上传新文件前先检查其是否已经存在于WordPress后台,避免重复上传。 - 2022-12-06:升级至
m2w 2.2
。优化了user.json
的参数结构使其更加灵活。至少在v2.2.1
版本或以上。更新若干教程。 - 2022-12-03:创建船新版本m2w 2.0!
前言
m2w 1.0的教程可见《Docker系列 WordPress系列 WordPress上传或更新Markdown的最佳实践》。
之前我一直使用m2w
来管理自己的博客文章。某次和小伙伴交流时,我发现大家管理本地文件夹的习惯不太一样。比如,我虽然会将某文件放在一个具有特定结构的文件目录里,但我定位文件的时候习惯使用everything
之类的软件搭配正则表达式,因此只是记文件大致名字而不怎么记文件位置。
但是,有相当一部分人定位文件的时候依赖对文件位置的记忆。基于这种现实,旧版本的m2w
对于某些小伙伴来说是不友好的,因为它需要用户指定legacy
和new
文件夹,因此用户无法根据自己的喜好将待同步/更新的文件放到任意目录。而且,将新文件“强行转移”至legacy里,这种操作也不太自然。此外,对于有多个站点/帐户的小伙伴来说,旧版本的m2w
也不太方便。
因此,趁着周末休息,我重新设计了m2w
——现在叫m2w 2
了 !m2w 2
有以下特性:
- 与
m2w 1.0
相比,使用 和config/user.json
略微不同的方式维护用户信息。 - 用户可以开心地保留原有的文件结构 (~ ̄▽ ̄)~ 。
- 通过多个
legacy_*.json
同时管理多个网站/帐户。 - 只需要使用1个 python 脚本
m2w.py
而不是两个(m2w 1.0
中的update.py
和upload.py
)。 - 像m2w 1.0 稳定且好用!
- 即时更新,而不像基于Github Page的更新策略一样有一定延时。
项目地址和原来是一样的:m2w。欢迎使用喔!用法比m2w 1.0
要更简单一些。对于m2w v2.2.4
或以上的版本在上传新文件前会对WordPress后台已存在的Post进行检测(基于文件名),所以不会导致重复上传,大家可以放心升级啦!
最后,所有的m2w版本均依赖xmlrcp.php,所以你的WordPress站点不要关闭其API(默认开放)。在WordPress 6.0时代,配合Wordfence,其实不需要太担心安全问题。建议站点有https的情况下再使用m2w,否则可能会造成帐号/密码泄露(如果博客仅有http,建议上https;可参考此教程)。
user.json
新的user.json与旧版本略有不同,具体结构如下:
"web01": {
"domain": "https://domain-01.com",
"username": "username-01",
"password": "password-01",
"path_markdown": [
"E:/Github/m2w/@test/main",
"E:/Github/m2w/@test/main2"
],
"post_metadata": {
"category": ["test"],
"tag": ["test"],
"status": "publish"
},
"path_legacy_json": "/config/legacy"
}
其中web01
可以随便取名,它与legacy_*.json
文件的命名和一些message有关,一但指定后不建议更改。可以添加多个类似于web01
的对象,这对于多网站/帐户的用户来说是挺友好的。post_metadata
指定了默认上传的类、标签和状态,不可以为空值。
值得一提的是,path_legacy_json
表征了legacy_*.json
类文件的位置,它一般不需要调整,保留默认的/config/legacy
取值即可。
目录结构
m2w 2
不会破坏用户的文件结构,它完全是通过legacy*.json
文件来判断是否有文件需要上传/更新。需要提醒的是,尽管m2w 2
将文件的绝对路径当成Key,但你尽量不要对不同的文件使用相同的文件名——如果你这样做,其实也会给看博客文章的人造成疑惑(尽管这不会报错,因为WordPress会自动分配不同的数字ID)。
m2w 2
的目录结构进行了优化。在user.json
文件中,依然由path_markdown
变量控制:
"path_markdown": [
"E:/Github/m2w/@test/main",
"E:/Github/m2w/@test/main2"
],
这里你可以加任意数量的顶级目录。如果该目录里有子文件夹和.md文件,也可以正确识别。由于代码里具有去重机制,所以并不需要担心路径重复 (~ ̄▽ ̄)~
网站/帐户
如下所示:
"domain": "https://domain-01.com",
"username": "username-01",
"password": "password-01"
domain
、username
、password
则和m2w 1.0
是一样的,即分别代表域名、用户名、密码。
项目展示
无论是更新文章还是上传文章,不再分开,完全由m2w.py
控制。大致的规则是这样的:
- 如果
legacy*.json
不存在,则所有的文件都是新文件,需要全部上传。 - 如果
legacy*.json
存在,如果某些key不存在,表明为新文件,需要上传这些key对应的md。 - 如果
legacy*.json
存在,如果key存在但value不同,表明为旧文件有新的改动,需要更新这些key对应的md。
我觉得这种逻辑对于普通用户来说是挺友好的,但是对进阶选手来说就不一定了。不过,进阶选手操作能力强,在我的基础上魔改,应该问题不大 (~ ̄▽ ̄)~
更新文章
为了演示多站点/帐号的功能,我使用了重复的站点/帐号。实际操作时你应该使用不同的帐号,否则文章会重复。
上传文章
同。
直接使用python3 m2w.py
之类的命令:
上传文章
直接使用python3 m2w.py
之类的命令:
其它提示
yaml头
和1.0版本一样,m2w 2
支持在markdown文件添加yaml头。如下所示:
---
category: [docker]
tag: [wordpress, docker]
status: publish
---
其中category
代表分类(一般是1个),tag
代表标签(可有多个),status
代表文章状态(publish发布/draft草稿/private隐私)。
逻辑判断
在m2w.py
中,首先进行网站连接,只有成功连接时才会进行md5 sum判断。该特点对于连接网络不稳定站点是必要的,因为由于q的原因这些站点偶尔可能会无法连接。如果事先进行了md5 sum判断且连接错误/超时,尽管下一次成功连接网站,也无法同步上次更新,因为md5值已经更新过了。该特性在m2w v1.0.7
中也有,但较早的m2w版本里我并未考虑到这种可能性(踩坑成长ing)。
用VSCode来运行m2w.py
的小伙伴建议加个代理。打开VSCode,按F1
可调出设置文件settings.json
。下图示范v2ray的ip和端口:
根据自己本地代理所使用的ip和端口进行更改即可。
信息级别
如果你觉得信息提示内容太“多”、太“杂”,可以在m2w.py
中设置verbose=False
。如下图:
message report一般是对应m2w.py
或up.py
脚本中的print
命令,如果不喜欢,自己注释或删除就行。这没啥好说的,挺简单 (~ ̄▽ ̄)~
小结
好久没有水过这么短的博文了,哈哈!不过可以解决问题就行。大家使用m2w 2
的时候有啥问题可以多多反馈!
Legacy
无用的代码或教程。
- 选择2(伪进阶选手):将原来的legacy文件夹列为
path_markdown
的元素之一(要保留旧的legacy.json
文件。并将其改名为legacy_*.json
之类的名字。这个*
与websites
中的网站名[比如下面示例中的web01
、web02
]相一致。路径也要与user.json
里所描述的一致)——建立新文件结构——日常上传/维护
对于m2w 1.0
的用户来说,想升级2.0有两种选择方式:
- 选择1(小白选手):(1)删除原博客的文章——(2)本地改回心仪的结构——(3)重新上传——(4)日常上传/维护。
- 选择2(进阶选手):(1)将本地markdown的文件结构搞好——(2)利用
m2w 2
的函数仅生成md5和新的legacy_*.json
文件,但不更新/上传markdown。下图展示的是m2w.py
代码的基本结构(只运行第2步的代码即可,不需要运行第1/3步)——(3)在新legacy_*.json
的前提下,日常上传/维护(此时使用的是m2w.py
的完整版)。这个方案最大的特点是不会影响WordPress站点已经存在的文章,比较推荐。
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍
m2w 怎么发表说说呢?
暂时没有支持。但之后应该也不会专门支持 (~ ̄▽ ̄)~
稍微改了一下代码,可以支持了源标签设置 shuoshuo 和别名设置了,有空看一下仓库 pr
收到,谢谢大佬的贡献 ~ 其实由于我的说说功能用得比较少,所以没有怎么关注。 不知道页面是否也可以适用?有空的话帮忙探索下
想请教一下,如果利用这种方式部署的博文中有数学公式的话,在网站上无法渲染显示,该怎么解决?
教程已经更新 ~ 请再次查看本文 (ฅ´ω`ฅ)
我的问题,我原先只是打开了WP Githuber MD的渲染器,发现没有效果,但是换成argon主题后,把主题自带的渲染器打开就可以了
又出现,每次用佬的m2w上传文章的时候就会想到,佬,太厉害啦!!ヾ(≧∇≦*)ゝ自从去年刚开始折腾那个跟着佬配置好后,一直用到现在,每用一次都会赞叹佬的才华和精神品质,
谢谢鼓励哈!
博主我发现如果文章头信息的
status
是draft
值, 则在后续更新的时候会报错FAILURE to find the post. Please check your User Configuration and the title in your WordPress.
经过排查是get_all_articles
方法在获取文章的时候, 只能获取到已经发布的(publish
)的文章, 于是报错了.这里的需求是有时候会有很多想法, 会随时记录下来, 但是由于没有整理好, 并不想直接发布出去.
我只会通过一些打印排查问题, 不会python, 博主能否帮忙解决下啊|´・ω・)ノ
已经提issues https://github.com/huangwb8/m2w/issues/16
对了头信息的
category``tag``status
是不是首次发布就得确认好, 后续修改的话, 只能通过WordPress
的后台进行修改么?暂时来说是这样 ~ 您可以尝试一下REST API模式,看看修改tag后会不会同步到WordPress后台。 一般来说,我都是很早就确定好tag或者category,很少中途修改;因而没有注意这个问题。 至于draft的问题,个人觉得暂时可以这样处理: 如果您觉得它是draft,那就暂时不要将markdown文件放到目标文件夹内。等您觉得它什么时候可以发表了,再copy到目标文件夹里就好了。这也是我的一贯做法
通过draft状态确定不上传该文档,这个feature我考虑一下要不要加到m2w里 ~
大神,请问上传失败怎么整
是否方便更加详细地描述bug本身?最好附上图片。 本评论区支持Markdown语法。
大佬你好,我这里运行myblog.py,部分文章提示“Messages:分类法中已存在同名项目”,相应的文章传不上去,删掉所有tag就好了。再加上tags运行myblog.py,不能更新tags,有的又报错。不太理解这是为啥,为啥要筛查tag,我的tags大概始终就是从十几个词里挑的。m2w版本是2.5.12。感谢!
没有遇到过这个bug喔,你贴一下markdown的yaml头、user.json内容(隐藏帐号和密码/token)和myblog.py内容。 可以发到邮箱 [email protected] 里
发啦
大佬,我在pycharm中运行该项目,依赖装入虚拟环境,运行后出现了这个问题,好像是找不到版本维护的json文件,这个版本维护文件不是自动生成的吗,求大佬帮忙看一看,感谢:
这个Json并不是自己自成的。 你直接根据模板修改一下就好了
如果实在不太懂的话,可以Todesk远程协助你
legacy*.json这个json文件我在教程文中以及github项目README都找了一遍,没能找到,大佬方便指个路吗
啊不好意思,我迷糊了 ~ 这个文件是自动生成的,它的作用是记录md5值 (~ ̄▽ ̄)~ 我已经意识到自己的错误了。因为当时我是在自己的网站里测试的,这个时候legacy文件已经是存在了的。 所以最新版本的m2w存在这个很严重的bug。我更新一下代码,之后通知您。 谢谢啦!
已经修复该bug。请更新m2w 2.5.12。谢谢提醒啦!
嗯嗯,大佬辛苦啦 ୧(๑•̀⌄•́๑)૭
大佬,发现一个小bug,就是如果定义一个一级标题,并且这个一级标题以#结尾,那么上传之后#会丢失,比如 C# 作为标题,那么上传之后就会变成 C,不过我感觉这个也有可能不是您代码的bug,说不定是wordpress解析问题?
可以在markdown里面使用转义符,C\#,这样转化为html的时候就不会有问题了
好的,感谢大佬!
貌似修改tag跟catagory不会跟着更新|´・ω・)ノ
是的。如果你要改tag,自己在后台修改就行。 一般我文章的tag都是固定的,文章完成时就已经确定了。