分类 技术开发 下的文章

修改Wordpress上传目录的方法-插件版,数据库版,动手版,进阶版

插件版
下载插件 WP Original Media Path
https://wordpress.org/plugins/wp-original-media-path/

这基本上是最无脑的版本了。即插即用。缺点是得在初始化wordpress的时候就配置好,否则还得事后手动复制原始上传目录到指定位置。

数据库版
用phpmyadmin打开wordpress所在数据库,找到表:wp-options-> option_id:57 or option_name:upload_url_path ,直接修改对应的option_value即可。注意,必须是完整路径,包含 http:// or https://
而插件版也只是用插件的方式修改了这个值。所以对于有强迫症不喜欢搞一大堆插件的患者而言,这是不错的选择。我也该吃药了。

动手版
在Wordpress根目录下找到 wp-config.php ,添加如下代码

define('UPLOADS', 'upload');

注意:
1,动手版优先级高于插件版,也就是说,在wp-config.php,则插件无法生效;
2,不论哪种方式,该目录必须位于 wordpress 安装目录下
3,如果需要经常更改上传目录(防止盗链),那就总得迁移上传目录,所以,还是手动版比插件版和数据库版更加方便

更改目录之后要做什么?
如果之前已经有上传过的媒体文件,需要将原始上传目录复制到上述方法指定的位置去。
如果出现无法写入的问题,要注意修改读写权限

进阶版
每个人都有不一样的想法和需求,那我来说,我经常会对wordpress系统做一些自定义,与此同时,wordpress在运营过程中又上传了大量的媒体。这个时候,要对wordpress做自己的版本控制,而上传的媒体文件也需要另外经常备份。所以如果有办法能够将wordpress系统和上传的文件彻底分开就完美了。
办法有很多,下面分享我的

用linux的ln命令,将上传目录硬链接到服务器上任意物理位置

sudo ln -s [目标实际目录] [wordpress中定义的上传路径]

这样的好处是,我们每次只需要每次修改 wp-config.php 和运行上面的命令,就可以实现wordpress中图片视频文件的更改网址。有效实现防盗链的同时,又不需要每次迁移真实上传目录。

更改目录后需要特别注意
在新建文章的时候,如果是直接添加媒体,会出现一些BUG。影响到视频文件的目录更改。
当直接添加媒体到文章内部的时候,媒体文件的URL是已经被完整写入正文中的。而在前端展示的时候,图片文件的URL会被替换为更改后的上传目录,所以可以正常访问,视频文件则不会。
正如上面所说的,因为URL是被完整写入正文的,所以在后台中编辑正文的时候,会出现图片和视频都无法显示的情况。
以上是wordpress目前的两个BUG,当前版本4.9.1,希望以后的版本可以修正。

当前的解决办法,就是在"添加媒体"的时候,图片文件,选择“创建相册”来添加。 视频文件,选择“创建视频播放列表”。通过这种办法,不论前台后台,均可正常显示。

Wordpress发布文章的时候 “形式”选项哪里去了?

Wordpress有很多维度可以给一篇文章进行分类:分类目录,标签,文章/页面,自定义栏目。

还有一个时有时无,飘忽不定的“形式”分类维度,可以让我们给的主体内容进行固定类别的分类,对于运营一个内容形式较为丰富的站点非常有帮助。形式分类如下: 标准 日志 图像 视频 引语 链接 相册 状态 音频 聊天
见下图
wordpress.format.png

为什么说它飘忽不定呢,是因为它不同于最开始给出的分类,是wordpress系统默认存在的分类维度,而是根据你当前的外观主题是否支持而定的。

对于支持“形式”分类的外观主题,一般情况下,会在自定义菜单中出现“形式”的菜单选择。所以在选择wordpress外观主题的时候,又多了一个考虑因素。

PS:如果你的主题是支持形式的,但发布文章的时候,还是没有显示该选项,可以在页面右上角“帮助”,傍边的“显示选项”中看看是否在“形式”前有打钩。

Wordpress中无法修改WordPress地址和站点地址的问题修复

某些情况下,安装好的Wordpress会出现无法更改 "WordPress地址(URL)" 和 “站点地址(URL)” 两个输入框的现象,如下图

wordpress.siteurl.greyout.png

解决办法如下
1,请千方百计,各显神通的登陆服务器找到Wordpress安装的根目录;
2,打开文件 wp-config.php
3,找到并删除,或者注释掉下面的两行代码

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');

4,保存关闭,并刷新Wordpress控制面板
5,哒哒,看下图
wordpress.siteurl.greyout.fixed.png

  • 如果在上述修改后出现了无法打开网站的问题,请检查数据库 Mysql
    Database: wp_options: option_name: siteurl

Database: wp_options: option_name: home
修改为当前网址,刷新网站即可

用 Wordpress 的插件来加持 Typecho

我喜欢 Typecho 的清爽界面。我也同时管理着多个 Wordpress 站点。相比Wordpress无所不能的插件,以及可以多站点统一管理的Jetpack,Typecho 每每让我感觉有那么些遗憾和不便。

实际的运维过程中,我想到一些点子来在 Typecho 下享用 Wordpress 的插件和便利。实现以下功能
1,免费且自动更新的SSL证书
2,实现Jetpack站点统计功能
3,在Wordpress.com中将Typecho与其它Wordpress站点一并管理。

做法:
首先,在Typecho下安装一个Wordpress。 我们只是需要利用Wordpress现成的Plugin,所以这个wordpress安装在哪个目录并不重要。并且注意,安装的时候,选择不要被搜索引擎发现。毕竟由于Wordpress庞大的安装量,虎视眈眈盯着它漏洞的攻击者很多,一个不经常使用的wordpress最好还是减少被发现的机会总是没有坏处的。

接下来,我们需要几个插件Screen Shot 2017-12-06 at 20.44.58.png

Jetpack by WordPress.com
熟悉Wordpress的朋友对这个插件一定很熟悉了。这个插件可以实现站点的统计功能,并且可以将该wordpress托管到wordpress.com集中管理。由于用不到这个插件的其他功能,所以可以在设置里将全部关闭,只保留 Security 即可。
Server IP & Memory Usage Display
可以查看当前wordpress占用服务器内存情况,如果服务器配置的好,应该只需要10M以下的内存占用就够了。如果内存开支很大,说明服务器的Apache或者PHP版本太低了,可以考虑升级以下。
WP Encrypt
免费给站点安装SSL证书,免费的SSL只有三个月有效期,所以需要到时候更新。还好这个插件支持自动更新,但偶尔会有小问题,可以参考这篇文章: https://84361749.com/post/wordpress-free-ssl.html
我们借用了SSL是加密整个域名的特点,所以将wordpress防止在域名下的某个目录,这样,就获得了整个域名的SSL。
WP Maintenance Mode
用这个插件可以临时将Wordpress关闭。反正用不到,就让它一直维护就好。

为了实现在Wordpress.com查看Typecho的受访统计,我们还得做点Hacking.
在安装并激活插件 Jetpack by WordPress.com 但未安装或者未启用 WP Maintenance Mode
的情况下,访问刚刚安装好的Wordpress站点,查看源文件,在代码最底部,会出现类似下面的两行HTML

<script type='text/javascript' src='https://stats.wp.com/e-XX.js' async defer></script>
<script type='text/javascript'>_stq=window._stq||[];_stq.push(['view',{v:'ext',j:'1:5.6',blog:'XX',post:'YY',tz:'-8',srv:'DOMAIN'}]);_stq.push(['clickTrackerInit','XX','YY']);</script>

DOMAIN 是你的域名
XX 是Jetpack在wordpress.com的ID,每个网站都不同;
YY 是一串数字,是当前wordpress页面ID。如果你希望得到Typecho的页面ID,可以用下面这个代码代替

<?php $this->cid();?>

这个办法并不完美,比如即使登录了wordpress也无法过滤掉自己的访问记录。另外还有因为Jetpack无法识别Typecho的页面ID,所以在wordpress.com的统计页面中会出现下面的这种情况。
Screen Shot 2017-12-06 at 21.10.26.png

目前就这么多,如果你在运营过程中发现有什么好点子或者思路,欢迎和我分享一下。

在线繁简转换工具

网上各类的繁简转化工具,多少是用 Javascript 的简单脚本做了繁体汉字和简体字之间的对应关系,偶尔使用没关系。可是,繁简转化还真不完全是把那些看着笔画多的汉字,变得笔画少一些。

比如,乾和干,就完全不是能够直接做对应转化的。
简体汉字里,也有乾这个字,当做乾坤的Qian字用。
正体中文呢,也有干字,当做不相干的Gan字用。
所以,繁体中的"乾燥","你幹什麼不干我事",一般工具无法对应做好相应的字字对应转化。

下面这款工具就在一般的繁简转化基础上,做了很多语义识别,明显强大很多。还能正确识别大陆和台湾不同语境下常用称谓的识别。比如"軟體"就不会简单粗暴的转化成"软体",而是"软件"。

http://opencc.byvoid.com

尽管这个工具功能性上,绝非其它一众简单的JS工具所能相比的。但是,其在操作界面的用户体验上,还真是有很大可以提升的空间。

如何从Wordpress.com "我的站点"界面回到 Wordpress控制面板

如果你有多个Wordpress站点需要运营,并且主要是日常发布文章,那Wordpress.com提供了非常合适的综合管理平台。一站式管理多个Wordpress站点。 不论是Wordpress.com站点还是自己托管在任何主机的的Wordpress站点。

某些时候,我们需要做一些更底层的站点配置工作,仍然需要回到Wordpress控制面板。而wordpress.com目前没有放置很便捷的按钮让你回到控制面板。

如果不嫌麻烦,我们还是可以从传统的路径,比如将站点的管理界面加入收藏夹,又或者打开浏览器,输入站点网址,登录控制面板管理界面。可是这样又失去了 wordpress.com 做为“一站式”管理的便利性。

其实wordpress.com有链接回控制面板的按钮,只是没有那么明显。

如果你是托管在 wordpress.com 内的站点,尽管没有托管在自己的主机中拥有那么多的自由配置,但回到控制面板依然会有一些自由。
在左侧菜单中,选择对应的站点后,在最下方会有一个 “WP 管理”的连接,让你回到熟悉的控制面板。
免费托管版可能没有这个连接

如果是托管在自己主机的Wordpress,我们会发现这个便捷的 “WP 管理”的链接消失了。 真想不通 Wordpress.com 是怎么想的啊。但我们依然可以从Wordpress.com回到控制面板,只是有些许繁琐。
在左侧菜单中,选择对应的站点后,还是在左侧菜单,选择“套餐”,选择“我的套餐”标签,右下方会出现我们期待的“返回控制面板”。

搞定烦人的WordPress更新误报提示

我有强迫症。

手机上永远不会出现任何未读角标,看着就烦。 而Wordpress的更新提示就真的戳中了我的死穴。应为不参与具体运营,所以平日不常登陆wordpress后台,没那么让人纠结。但每每登陆,总有那么个提示,然后无论你如何不停地点更新当前版本,或者隐藏此更新,都没啥屁用。

遇到这种问题,有几种可能:
1,最下面有个翻译更新,不像其它更新会在当前页面直接显示出来,而是需要你多点击一下才能看到。
2,某个插件/主题发布的时候,版本号有错。停用都没用,必须删掉,或者等插件的下次更新。这也告诉我们,没事不要乱装插件玩。
3,自己修改过的插件/主题,没有把原始插件/主题中检查更新相关的代码关闭或移除,只能自己去Debug了。

AWS Route 53 域名解析托管后长时间不生效的故障分析

启用了一个注册了很久的域名,之前有在Route 53中做过设置,因为Route 53每个月都会收取解析费用($0.5),所以取消该记录也有一段时间了。这天准备复用的时候,发生怪事了。

一般来说,在Route 53做解析配置,生效时间都非常的快,但这次事情不同,现在都已经有24小时了,还是提示

ping: cannot resolve YourDomain: Unknown host

真心奇怪,进过仔细分析对比,发现,在Route 53中,域名的NS记录是

ns-1104.awsdns-10.org. 
ns-243.awsdns-30.com. 
ns-2030.awsdns-61.co.uk. 
ns-760.awsdns-31.net.

但是用whois查域名记录,NS是

Name Server: NS-1085.AWSDNS-07.ORG
Name Server: NS-753.AWSDNS-30.NET
Name Server: NS-1752.AWSDNS-27.CO.UK
Name Server: NS-501.AWSDNS-62.COM

所以,目前域名还是还被whois记录中的NS解析着。根据aws帮助文档的说法,要至少48小时才能全部生效。鉴于以往操作都是分分钟生效,外加我这个急性子,这还真让我捉急啊。

48个小时,还没有生效。继续研究后,有了新的发现。

强制更新域名的DNS服务商。
在 Route 53 的 Registered domains 页面中,选择无法正常解析的域名,在左侧 Name servers 的列表最下面 Add or edit name servers 将原有NS服务地址全部删除,然后替换为 Route 53 Hosted Zone 中提供的NS地址即可。

OneNote Error code: 0xE0000007

OneNote 突然出现同步异常。错误提示为:

We ran into a problem syncing your notebook. (Error code: 0xE0000007)

至少微软到目前为止并没有给出一个明确的解决方案。而是给出很多步骤挨个尝试。

0,检查网络;未解决
1,强制同步; 未解决
2,关闭OneNote,再次打开; 未解决
3,退出登录,再次登录; 也没有解决。

不停的重复1-3, 问题解决。

Typecho 1.1 BUG #1 ,我发现了一个隐藏秘籍:定时发布

在整理一篇技术文章之后,开开心心的发布,结果Typecho提示404了。顿时内心万马奔腾。后台查看,还在。

只好开启 Debug 模式。 讲真,你说这该从哪里下手啊。

开始排查吧,已经发布的文章逐个点击,已经发布的没问题,只有最新发布的两篇文章404了。

改“设置-永久链接”,无效。

难道是因为后台有大量的未发布的草稿?无奈只得先行发布,在找机会补完内容了。

结果依旧扑街,最新发表的两篇依旧404。

好吧,休息一下,喝杯茶。

再次坐下来仔细查看这两篇文章和其他已经发布的有什么不同,最终在管理文章列表页中发现这两篇文章的日期一栏,是一个日期,而下面刚刚发布的文章都是诸如XX分钟前,XX小时前,昨天 XX:XX 之类,而这两篇最近发布的文章,却是以日期的形式表现。并且这个日期还是两天以后的时间。改过来后,BUG解决了。可是在这之前,我都没有注意过编辑页面上有个“发布日期”输入框,更不可能擅自改动啊。所以这还是个BUG。

然后我利用这个BUG,在现在正在编写的页面上,把“发布日期”修改为当前时间 +1 分钟,发布后,又404了。

站起来伸个懒腰,再续上一杯茶,时间到,刷新,文章出现了。 这到底是个BUG呢,还是一个Typecho的隐藏大招啊?

续,模拟现场
在一种情况下,可能出现复现Bug,就是保存了草稿,然后“设置-基本-时区”,选择了比原先更晚一些的时区,这个时候,如果在时差内发布草稿,就会复现这个Bug了。
我确实是修改过时区,可那个时候,是已经出现了404 bug,我在到处设置找解决办法。况且,两篇出现404的文章,当时的日期是2017-11-29和2017-11-30, 而当前时间是 2017-11-26, 时差最多也只能制造1天的变量。

如果有新的线索,在更新吧。

Wordpress 免FTP,免输入密码系统升级,安装插件,安装主题

环境: ubuntu+apache+php7+wordpress4.9

最简单的方法,在 /wp-config.php 文件最下面,增加

define('FS_METHOD', 'direct');

尝试下载个插件看看,如果wordpress所在目录的读写权限配置合适,这个时候,就全部搞定了。
如果出现提示

wordpress 安装失败:无法创建目录。

这个时候,我们需要把 wp-content 目录权限改为 775

chmod -R 775 wp-content

如果还是遇到问题,那还是权限的问题,需要变更一下 wp-content 目录的所有权,之后再变更执行权

chown -R [owner]:[group] wp-content
chmod -R 775 wp-content

如果你只有FTP,没有SSH,也可以尝试把FTP信息写入 /wp-config.php 实现免密码。

define("FTP_HOST", "localhost");
define("FTP_USER", "yourftpusername");
define("FTP_PASS", "yourftppassword");

AWS EC2 镜像备份及恢复实例

在清理AWS EC2主机的时候,错删了一个网站目录,还好找到了曾经的备份镜像,化险为夷。

恢复之前,先了解一下EC2怎么样进行镜像备份。
1,登录AWS, EC2
2,EC2管理面板的左侧边栏:ELASTIC BLOCK STORE
3,点击 Snapshot, 会出现所有镜像列表。 是否收费呢???
4,页面正上方蓝色按钮“Create Snapshot”
Volume: 要备份的EC2主机Volume
Name: 随便起,自己明白就好
Description: 随便写,自己明白就好
Encrypted: No.
5, 点击蓝色按钮 “Create”
8GiB的Volume, 占用率50%, 大约只用了10分钟左右备份完成。

已经有了镜像备份后,接下来尝试将指定镜像文件加载到EC2主机中,就可以轻松找到被删除的文件进行恢复了。

加载镜像文件,首先要将镜像变成一个 Volume
1,选中要加在的镜像
2,点击上方的灰色按钮“Actions”
3,在下拉列表中点选“Create Volume”
4,全部默认,直接点击右下角蓝色按钮 “Create Volume”
5,EC2管理面板的左侧边栏:ELASTIC BLOCK STORE
6,点击 Volumes
7,如果这是第一次操作,那么,这里至少会有两个Volume, 看State, 绿色in-use,就是EC2主机默认使用的Volume,而另外一个蓝色avaliable则是在之前步骤 Create 的 Volume
8,选中之前步骤Create 的 Volume,点击上方灰色按钮 “Actions”
9,下拉列表中选择 “Attach Volume”
Volume: 不理会
Instance: 选择对应的EC2主机
Device: 挂在的名字,如果重复会自动重命名,所以默认即可,记住名字,一会要用到
10,点击蓝色按钮 “Attach”

到这里,Volume已经加载了,还需要在SSH里挂在这个主机
1, Login SSH
2, 查看加载的Volume
lsblk
3, 建立一个目录准备挂载的Volume
sudo mkdir /mybackup
4, 我其实也不懂这一步是干嘛的
sudo file -s /dev/xvdg
5,挂载Volume到这个目录,(下面命令中的xvdf就是之前加载的Volume名称)
sudo mount /dev/xvdg /mybackup/

全部用完之后, detache 就好了

参考
https://devopscube.com/mount-ebs-volume-ec2-instance/

升级PHP 7后Typecho1.1无法顺利连接MySQL数据库

背景: 本站由Typecho 1.1搭建,近日迁移服务器,由原先的PHP 5.3.29, 迁移至一台PHP 7.0.21的服务器。一切配置妥当后,无视无法连接数据库,打开后台提示

[Sun Nov 01 01:01:01.xxxxxx] [xxx] [pid xxx:tid xxx] [client xx.xx.xx.xx:xxx] AH01071: Got error 'PHP message: Adapter Typecho_Db_Adapter_Mysql is not available\n'

应该是MySQL的问题,打开

/config.inc.php

修改

/** 定义数据库参数 */
$db = new Typecho_Db('Mysql', 'typecho_');

/** 定义数据库参数 */
$db = new Typecho_Db('Mysqli', 'typecho_');

error_log 不再抛出错误,但是网站依然无法打开。
继续修改为

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'typecho_');

一切恢复正常。

Wordpress用户福利,完全免费的SSL服务插件WP Encrypt,含Bug修复

真心福利,虽然每90天得更新一次证书吧,但这个插件WP Encrypt自带提醒,而且可以自动完成更新。
不过,由于涉及到怎么安全存放SSL证书,以及每90天可以自动更新,这个插件WP Encrypt在头一次安装的时候,还是需要一点点小技巧的,总结如下。

搜索并安装插件 WP Encrypt, 激活,进入设置页

Organization Name:   ;随便填,一般填自己网站名称
Country Name: China  ;不知道填写汉字中国会怎么样?
Country Code: CN     ;
Auto-generate Certificate:  ; 如果需要系统帮你自动更新,打钩
Expire Warnings:            ; 到期前登陆wordpress管理面板会有提示
Expire Warnings Trigger:    ; 提前多少天开始提示

点“保存更改”,就会遇到第一个麻烦了。

Could not create directory /PATH/letsencrypt/live. Please check your filesystem permissions.

解决办法

sudo chown -R bitnami:daemon letsencrypt
sudo find letsencrypt -type d -exec chmod 0775 {} \;
sudo find letsencrypt -type f -exec chmod 0664 {} \; 

再点“保存更改”,显示“设置已保存”,表示目录权限可以了,至少短期内,不会出现什么状况了。文末有可能出现状况的修复提示哦。

拖动页面到底部,有显示灰色按钮“Register Account”,如果上一步没问题,这一步也会顺利通过。

Could not create directory /PATH/htdocs/.well-known/acme-challenge. Please check your filesystem permissions.
sudo chown -R bitnami:daemon .well-known
sudo find .well-known -type d -exec chmod 0775 {} \;
sudo find .well-known -type f -exec chmod 0664 {} \; 

再次拖动页面到底部,有显示蓝色按钮“Generate Certificate”, 点它,提示:
Certificate generated for DOMAIN www.DOMAIN.

再再次拖动页面到底部,显示

Certificate: /..PATH../letsencrypt/live/DOMAIN/cert.pem
Certificate Chain: /..PATH../letsencrypt/live/DOMAIN/chain.pem
Certificate Full Chain: /..PATH../letsencrypt/live/DOMAIN/fullchain.pem
Private Key: /..PATH../letsencrypt/live/DOMAIN/private.pem

最后,配置一下主机配置文件,一般是 httpd.conf 文件,或者相关的 vhost.conf 文件

<VirtualHost *:443>
    ServerName DOMAIN
    ServerAlias www.DOMAIN
    DocumentRoot "/PATH"
    Include "blah.blah"

    SSLEngine on
    SSLCertificateFile "/PATH/letsencrypt/live/DOMAIN/fullchain.pem"
    SSLCertificateKeyFile "/PATH/letsencrypt/live/DOMAIN/private.pem"
</VirtualHost>

好了,重启主机,大功告成, 输入 https://DOMAIN 开心一下吧。

最后要提示几点
1,不要忘记修改Wordpress中“设置”-“常规”中的网站;
2,WP Encrypt插件使用了letsencrypt的免费SSL服务,但并非letsencrypt自家开发,所以会出现以下类似情况

Provided agreement URL [https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf] does not match current agreement URL [https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf]

就是说letsencrypt服务协议更新了,但是插件没来得及更新,这个时候,我们只需要修改一下插件文件,在186行下增加最新的服务协议即可。

File: wp-content/plugins/wp-encrypt/inc/WPENC/Core/Client.php
184:                private function __construct() {
185:                        // Newer licenses must come first.
186:                        $this->licenses = array(
187:                                '2017-11-15'    => 'https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf',
188:                                '2016-08-01'    => 'https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf',
189:                                '2015-07-27'    => 'https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf',
190:                        );
191:                }

Mysql LOG / upgrade mysql

171124 19:14:00 [Warning] IP address '85.93.20.74' could not be resolved: Temporary failure in name resolution

171122 8:05:47 [Warning] IP address '59.45.26.150' could not be resolved: Name or service not known

171123 1:39:28 [Warning] IP address '158.69.200.72' has been resolved to the host name '72.ip-158-69-200.net', which resembles IPv4-address itself.

171123 7:15:03 [Warning] IP address '218.26.109.246' has been resolved to the host name '246.109.26.218.internet.sx.cn', which resembles IPv4-address itself.