使用 Loco Translate 插件翻译 WordPress 主题和插件

国外有很多优秀的 WordPress 插件和主题,本着拿来主义的原则,我们需要“洋为中用”,把它们翻译成中文。

翻译的方法有很多种,比较“专业”的办法,是直接在 Linux 操作系统内,把 .pot(Portable Object Template) 文件拷贝成 对应语言的 .po 文件,然后直接 vim 修改这个 .po 文件(Portable Object),然后再运行 msgfmt 命令编译成 .mo 文件( Machine Object)
下面以主题的名字 skin 为例子,skin.pot 文件在 wp-content/themes/skin/languages 下,需要先拷贝成 skin-zh_CN.po。

# msgfmt skin-zh_CN.po -o skin-zh_CN.mo

另外一种办法是在 PC 端安装一个 PoEdit 软件,加载 pot 文件之后,能选择语言,再编译成 mo  文件,把 mo文件上传到主题对应的 language 目录即可。

下面介绍采用 WordPress 插件 Loco Translate 在后台管理界面直接翻译的方法:

  1. 下载安装并激活插件,我们继续采用我最喜欢的 wp-cli 命令行:
    • # wp plugin install loco-translate –activate
  2. 进入管理后台,选择左边的 “Loco Translate”菜单,选择语言,可以用 WordPress 的语言,或者自己定义某个国家的语言。然后选择默认的 location:  themes/skin/language/<locale>.po,点击 “Start translating”,开始翻译。如果遇到权限问题,需要确认 language 目录对Web 服务器的运行用户可写。
  3. 接下去就是简单的翻译工作了, 在最下部的翻译窗口输入对 Source Text 的翻译。翻译完毕之后即可保存。然后刷新前台页面,既可以看到翻译已经生效。

详细的英文教程在: https://localise.biz/wordpress/plugin/beginners

在翻译窗口可以采用以下快捷键:

  • 结束并跳到下一个: Ctrl ↵
  • 下一个字符串: Ctrl ↓
  • 前一个字符串: Ctrl ↑
  • 下一个未翻译字符串: Shift Ctrl ↓
  • 前一个未翻译字符串: Shift Ctrl ↑
  • 从原始文本拷贝: Ctrl B
  • 清空翻译: Ctrl K
  • 切换模糊搜索: Ctrl U
  • 保存 PO 并编译成 MO: Ctrl S
  • 切换不可见字符: Shift Ctrl I

WordPress 命令行自动部署的完整脚本 [附中文语言包的阿里云网站更新]

前文介绍 WP CLI 自动部署的脚本有一些小缺陷,主要是需要先创建用户数据库授权,才能创建 wp-config.php,否则报 MySQL 1045 错误,也就是用户名或者密码的权限错误。

感兴趣的读者可以直接点击下载本脚本: https://download.yj777.cn/wordpress/auto-deploy/deploy-wp.sh

该脚本针对中国用户做了特别的优化。特别是中文语言包的下载,由于 GFW 的缘故,把中文语言包放置到了国内阿里云服务器。待优化的工作主要是 Apache DocumentRoot 的判定以及根据 Site URL 设置虚拟主机,还有就是 .htaccess 的创建。希望能在 V2.0 实现。

上海甬洁网络科技有限公司专注于企业的互联网转型,承接各类电子商务网站的建设,社会化媒体,特别是微信公众号的运营,微信小程序开发等;也承接中小企业的 IT 业务外包。

我们计划把 tech.yj777.cn 建设成国内 WordPress/WooCommerce 的社群。

先从下载服务开始。

#!/usr/bin/env bash
# WordPress 自动化安装
# Author: Albert Xu (albertxu AT freelamp.com)
# 创建日期: 2017-5-31
# Last Modified: 2017-6-15

# 需要配置的参数

# =========================================
APACHE_ROOT=/var/www/html

clear
echo -e “\n\t\tWordpress 自动部署系统 V1.0 (作者:徐永久 albertxu@freelamp.com)\n”
read -p “请输入站点安装目录: ” dir

WP_URL=http://localhost/report/$dir

read -p “请输入数据库名: ” DBNAME
read -p “请输入数据库用户名: ” DBUSER
# read -p “请输入数据库口令: ” DBPASS
# read -p “请输入站点 URL: ” WP_URL
echo
read -p “请输入站点名字: ” WP_TITLE
read -p “请输入站点管理员登录用户名: ” WP_ADMIN
read -p “请输入站点管理员邮箱: ” ADMIN_EMAIL
DBPASS=$(date +%s | sha256sum | base64 | head -c 32 ; echo)
WP_PASS=$(date +%s | sha256sum | base64 | head -c 10 ; echo)

WP_FOLDER=$APACHE_ROOT/$dir
# WP_FOLDER=$dir

# [ -d $WP_FOLDER ] && echo -e “\n文件夹已经存在!请尝试运行 rm -rf ${WP_FOLDER} ” && exit 1

WP=”/usr/bin/wp –allow-root –path=$WP_FOLDER”
echo -e “1. 自动下载/解压最新版本的 WordPress … \c”

mkdir ${WP_FOLDER}
[ ! -d $WP_FOLDER ] && echo “Folder not exist!” && exit 1
cd ${WP_FOLDER}
$WP core download

mysql “$DBNAME” -e “exit” 2>/dev/null
[ $? == 0 ] && echo -e “\n数据库已经存在!请尝试运行 mysql -e \”drop database ${DBNAME}\”” && exit 1

echo “2. 创建数据库账号 … ”
mysql mysql -e “grant all on ${DBNAME}.* to ${DBUSER}@localhost identified by ‘${DBPASS}’;flush privileges;”
[ $? != 0 ] && echo “创建失败! ” && exit 2

echo -e “3. 创建配置文件 …\c”
$WP core config –dbname=${DBNAME} –dbuser=${DBUSER} –dbpass=${DBPASS}
[ $? != 0 ] && echo “创建配置文件失败!” && exit 3

echo -e “4. 创建数据库 …\c”
$WP db create
[ $? != 0 ] && echo “创建失败!” && exit 4

echo -e “5. 创建实例 … \c”
$WP core install –url=$WP_URL –title=”${WP_TITLE}” –admin_user=”${WP_ADMIN}” –admin_email=”${ADMIN_EMAIL}” –admin_password=”${WP_PASS}”
[ $? != 0 ] && echo “创建 WordPress 实例 \”${WP_TITLE}\” 失败!” && exit 5

echo -e “6. 检查 站点 $WP_URL 的可用性 … \c”
TMP=/var/tmp/wp_test.out
wget -o $TMP $WP_URL
[ -z $TMP ] && echo “实例创建有问题,请检查 $WP_URL!” && rm $TMP && exit 6
rm $TMP
echo “成功”

echo “7: 其他任务, 安装激活中文语言包、主题、插件等 …”

echo -e “\t安装中文语言包 …”
# $WP core language install zh_CN –activate
LDIR=${WP_FOLDER}/wp-content/languages
[ ! -d ${LDIR} ] && mkdir ${LDIR}
cd ${LDIR}
L=core-default-4.7.5-zh_CN.zip
wget -q https://download.yj777.cn/wordpress/translation/$L
unzip -q $L
$WP language core activate zh_CN
rm $L

echo -e “\t安装主题 …”
# echo “结束: 请访问 $WP_URL 验证安装”
# $WP theme install https://downloads.wordpress.org/theme/skin.0.8.6.zip –activate
$WP theme install https://download.yj777.cn/wordpress/themes/skin.0.8.6.zip –activate

echo -e “\t安装配置插件 …”

$WP plugin delete hello
$WP plugin delete akismet

# Add and Remove Base Plugins
$WP plugin install kirki tabbed-login antispam-bee admin-menu-tree-page-view contact-form-7 advanced-custom-fields –activate

# Delete installed posts and create homepage
$WP post delete $($WP post list –post_type=’page’ –format=ids) –force
$WP post delete $($WP post list –post_type=’post’ –format=ids) –force
$WP post create –post_type=’page’ –post_title=”Home” –post_status=”publish”
$WP option update page_on_front 3
$WP option update show_on_front page

# Replace Uncategorized with a new Category as default
$WP term create category 新闻
$WP option update default_category 2
$WP term delete category 1

# Set Your Timezone – Most of you will want to change this
TIMEZONE=”Asia/Shanghai”
$WP option update timezone_string $TIMEZONE
$WP option update blogdescription “”
$WP option update date_format “Y年n月j日”
$WP option update time_format “ag:i”

# Options checkboxes the way I like them
$WP option update default_pingback_flag 0
$WP option update default_ping_status 0
$WP option update default_comment_status 0
$WP option update comment_registration 1
$WP option update comment_moderation 1
$WP option update comments_notify 0
$WP option update show_avatars 0

# 写 htaccess
# 设置 permalink
# Update rewrite (You’ll still need to resave the Settings > Permalinks Page)
# $WP rewrite structure ‘/%year%/%monthnum%/%postname%’
$WP rewrite structure ‘/%postname%/’ –hard
$WP rewrite flush –hard

# create a navigation bar
$WP menu create “Main Navigation”

# Create necessary Apache configs
# cd /etc/apache2/sites-available/
# sudo cp default.conf $url.conf
# sudo sed -i “s/localpress/$url/g” $url.conf
# cd ../sites-enabled/
# sudo ln -s ../sites-available/$url.conf $url.conf
# sudo service apache2 restart

# Update /etc/hosts – You’ll need to do this manually for your own machine
# sudo sed -i “s/#addmore/$url #addmore/g” /etc/hosts

# Spit out username and password details
echo “”
echo “”
echo “新站点 $WP_TITLE 已经建立”
echo “URL: $WP_URL/wp-admin/”
echo “用户名: $WP_ADMIN”
echo “口令: $WP_PASS”
echo “”

使用 Composer 安装 WordPress

编译自: https://roots.io/using-composer-with-wordpress/

原文日期:2013年8月18日

如果你用过 Node.js 的 npm,Ruby 的 Bundler,Python 的 pip,那么你一定已经知道了 PHP 的依赖包管理系统: Composer。

本文将简单介绍使用 Composer 部署 WordPress 的方法,都是干货。

直接上代码:

创建一个目录,在这个目录下创建 composer.json 文件如下:


{
"repositories": [
{
"type": "composer",
"url": "https://wpackagist.org"
}
],
"require": {
"php": ">=5.4",
"johnpbloch/wordpress": "4.8",
"fancyguy/wordpress-monolog": "dev-master",
"wpackagist-plugin/advanced-custom-fields": "*",
"wpackagist-plugin/posts-to-posts": "1.4.x"
},
"extra": {
"wordpress-install-dir": "wp"
}
}

请注意,原文的 WordPress 版本为 4.2,本文的版本已经修改为 4.8,并且已经把 http 修改成 https,否则报错。

生成这个文件, 直接运行 composer install ,即可安装 wordpress 了。

如果以后有新的版本发布, 只要直接运行 composer update 即可。

MySQL 基础命令

一、数据库操作SQL语句

1、显示服务器上当前存在什么数据库

show databases;

2、创建名称为user的数据库

create databases user;

3、删除名称为user的数据库

drop databases user;

4、选择user数据库

use user;

二、表操作SQL语句

1、显示当前数据库中存在什么表

show tables;

2、查看student表结构

describe student;

3、从student表中检索出唯一的不重复记录:

select distinct username from student;

4、更改表结构,将student表username字段的字段类型改为CHAR(25)

alter  table student change username usernamechar(25);

5、查看某张表的表头

desc student ;

6、修改表名

① rename table 原表名 to 新表名;

② alter table 原表名 rename to 新表名;

7、复制表

create table table2 select * from table1;

8、给表添加字段

alter table 表名 add  column 字段名 属性;

9、删除字段

alter table 表名 drop column 字段名

三、其它

1 获取当前时间

select now();

2 退出MySQL命令

exit(回车)

3  mysql服务的启动和停止

net start mysql

net stop mysql

4  登陆mysql

mysql -u 用户名 -p 用户密码

5 增加新用户

grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”

如,增加一个用户user1密码为password1,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:

grant select,insert,update,delete on *.* to user1@localhost Identified by “password1”;

如果你不想user1有密码,可以再打一个命令将密码去掉。

grant select,insert,update,delete on mydb.* to user1@localhost identified by “”;

相关连接:

抓取每张表的行数

用 wp-cli 自动部署 WordPress

本脚本利用 WordPress 命令行工具 wp-cli 实现了 WordPress 的自动部署,对于需要经常部署 WP 的运维会比较有用。


#!/bin/bash
# WordPress 自动化安装
# Author: Albert Xu (albertxu AT freelamp.com)
# 创建日期: 2017-5-31
# Last Modified: 2017-5-31
# 需要配置的参数
WP_FOLDER=wp_test8
WP_TITLE='Wordpress 8'
WP_ADMIN='admin'
WP_URL=http://localhost/"$WP_FOLDER"
ADMIN_EMAIL='admin@yj777.cn'
ADMIN_PASS='hello'
DBNAME=wp_test8
DBUSER=wp_test8
DBPASS=hello


WP="/usr/bin/wp --allow-root "
echo "1. 自动下载/解压指定版本的 WordPress ..."
WP_DL="https://wordpress.org/latest.zip"
wget $WP_DL
[ -d $WP_FOLDER ] && echo "文件夹已经存在!请尝试运行 rm -rf $WP_FOLDER " && exit 1
mysql "$DBNAME" -e "exit" 2>/dev/null
[ $? == 0 ] && echo "数据库已经存在!请尝试运行 mysql -e \"drop database $DBNAME\"" && exit 1
unzip -q `basename $WP_DL`
[ $? == 0 ] && [ -d "wordpress" ] && mv wordpress $WP_FOLDER
[ ! -d $WP_FOLDER ] && echo "文件解压失败!" && exit 2


echo "2. 创建数据库 ..."
mysql -e "create database $DBNAME; grant all on $DBNAME.* to $DBUSER@localhost identified by '"$DBPASS"';flush privileges;"
[ $? != 0 ] && echo "创建数据库 $DBNAME 失败! " && rm -rf $WP_FOLDER && exit 3


echo "3. 创建配置文件 ..."
cd $WP_FOLDER
$WP core config --dbname=$DBNAME --dbuser=$DBUSER --dbpass=$DBPASS
[ $? != 0 ] && echo "创建配置文件失败!" && exit 4


echo "4. 创建实例 ..."
$WP core install --url=$WP_URL --title=$WP_TITLE --admin_user="$WP_ADMIN" --admin_email="$ADMIN_EMAIL" --admin_password="$ADMIN_PASS"
[ $? != 0 ] && echo "创建 WordPress 实例 $WP_TITLE 失败!" && exit 5


echo "5. 检查 站点 $WP_URL 的可用性 ..."
TMP=/var/tmp/wp_test.out
wget -o $TMP $WP_URL
[ -z $TMP ] && echo "实例创建有问题,请检查 $WP_URL!" && rm $TMP && exit 6
rm $TMP


echo "6. 复制 Theme 以及 Plugin ..."

此处略过具体复制语句

echo "7. 激活 Theme/Plugin ..."
$WP theme activate twentyfifteen
$WP plugin activate hello
echo "8. 更新 Option ..."
# $WP option update siteurl=adbfabd
echo "结束: 请访问 $WP_URL 验证安装"

微信小程序支付总结

该文章纪录了我在开发小程序支付过程中的具体流程

1. 申请微信支付

小程序认证后进入微信支付申请小程序的微信支付

2.配置商户信息

申请微信支付成功后,登陆商户平台(pay.weixin.qq.com)进入账户中心,设置微信商户的API Key与下载证书

3.配置Https服务器

小程序的前端是使用微信提供的框架开发,但是后台依然是开发者自己的服务器。小程序发起的是 https 请求,意味着小程序开发者必须配置 https 服务器。

4.服务端准备

获取openID

我们需要在小程序的客户端js中获取当前用户的openid,通过调用wx.login方法可以得到用户的code,然后开发者服务器使用登录凭证 code 获取 openid。

获取prepay_id和支付签名验证paySign

下载微信支付sdk,配置微信小程序信息与商户信息,放置证书到对应目录。调用微信申请支付JSAPI的方式生成一串验证信息如下:

appId:"wx3*******6"//小程序id
nonceStr:"qdpys6rdizbnpj12ahwvkf568a6c1sr9" //随机字符串
package:"prepay_id=wx2017***********3" //wx的预支付交易单
paySign:"8A7DC1A560B3B6DB0C656AC382D3E6F1"//微信签名
signType:"MD5"//签名加密
timeStamp:"1481167418"//时间戳,自1970年以来的秒数

5.小程序端发起微信支付

这里直接调用wx.requestPayment方法:

wx.requestPayment({
‘timeStamp’: timeStamp,
‘nonceStr’: nonceStr,
‘package’: package,
‘signType’: ‘MD5’,
‘paySign’: paySign,
‘success’: function (res) {
console.log(‘success’);
console.log(res);
}
});

OK,微信小程序支付完成。

ThinkPHP 的项目部署

# yum install php-composer-installers
# composer config -g repo.packagist composer https://packagist.phpcomposer.com
# composer update
# composer create-project topthink/think projectname  –prefer-dist

为生产环境作准备
最后提醒一下,在部署代码到生产环境的时候,别忘了优化一下自动加载:

# composer dump-autoload –optimize
安装包的时候可以同样使用–optimize-autoloader。不加这一选项,你可能会发现20%到25%的性能损失。

MySQL 数据库远程连接常见错误 2003 和 2013

在 Windows 7 上安装了 Oracle Virtualbox,跑 CentOS 7 Guest。MariaDB 数据库默认侦听在 127.0.0.1。

VirtualBox 上开启两块网卡,一块做 NAT,把所有 3306 转发到 CentOS 上,一块做桥接。

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.7.66 netmask 255.255.255.0 broadcast 192.168.7.255
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.3.15 netmask 255.255.255.0 broadcast 10.0.3.255
连接不同的界面,可以看到如下错误:

# mysql -h 192.168.7.52 -u xiaobao -p
Enter password:
ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0

# mysql -h 192.168.7.66 -u xiaobao -p
Enter password:
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.7.66’ (111)

解决问题的办法就是让 MySQL 听在所有网络界面上, 即注释掉 /etc/my.cnf 里如下一行:

bind-address = 127.0.0.1

重启: # service mariadb restart

当然, 2013 错误的另外一个解决办法是添加一行:

skip-name-resolve

实际上要考虑服务器端 /etc/resolv.conf 是否正确配置。

隐藏 Apache 服务器版本信息

在 Apache 配置文件 /etc/httpd/conf/httpd.conf 上加上以下两行,能隐藏具体的 Apache 版本信息以保护服务器由于潜在的漏洞而招致攻击。

ServerSignature Off
ServerTokens Prod

设置之前的 http 头:

# curl -I http://localhost/
HTTP/1.1 200 OK
Date: Fri, 19 May 2017 00:20:09 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips
Cache-Control: max-age=0, no-cache
Content-Type: text/html; charset=UTF-8

# service httpd reload
Redirecting to /bin/systemctl reload httpd.service

设置之后的 http 头:
# curl -I http://localhost/
HTTP/1.1 200 OK
Date: Fri, 19 May 2017 00:20:19 GMT
Server: Apache
Cache-Control: max-age=0, no-cache
Content-Type: text/html; charset=UTF-8