使用GoAccess分析Nginx日志,LNMP环境安装部署最快步骤

使用Nginx的服务器进程会碰到流量异常,被各种扫描的现象。这时候我们就需要对服务器的访问日志进行分析,我的一台LNMP服务器Nginx日志为/home/wwwlogs/access.log,有100多M,文本打开后基本不能用肉眼看到多少有效信息,需要一款日志分析工具的帮助,最好能有图表化功能。目前开发者推荐最多的日志分析工具是GoAccess,这里记录一下安装和部署步骤。

首先跑去 GoAccess官方 找到最新版和安装方法
登录服务器,运行以下命令:
$ wget https://tar.goaccess.io/goaccess-1.5.6.tar.gz
$ tar -xzvf goaccess-1.5.6.tar.gz
$ cd goaccess-1.5.6/
$ ./configure --enable-utf8 --enable-geoip=mmdb
$ make
# make install

查看详细 »

给WooCommerce的运费(Shipping Method)增加自定义描述字段

如果一个WooCommerce网站存在多种不同的运费(Shipping Method),则可能有必要让用户在运费选择的模块中了解不同运费的区别。你可以解释运输的时长,或者解释价格的构成等,总之就是提供更多信息帮助用户做出最好的选择。比如在这里,我就对每个运费添加了时长的解释:

一个便捷的办法是通过以下代码实现的:

add_filter('woocommerce_cart_shipping_method_full_label', 'brain1981_custom_shipping_method_label', 10, 2);
function brain1981_custom_shipping_method_label( $label, $method ){
	$txt = "";
	if( $method->id=="flat_rate:1" || $method->id=="free_shipping:4" ){
		$txt = 'In 15 Business days';
	}else if( $method->id=="flat_rate:2" || $method->id=="free_shipping:3" ){
		$txt = '7-10 Business days';
	}
	return $label . '<br /><small>' . $txt . '</small>';
}

需注意的是,WooCommerce的运费ID的格式都是以这样的形式呈现的:
flat_rate:1
free_shipping:2

以上这段代码就是事先辨认出这些运费ID,通过woocommerce_cart_shipping_method_full_label这个钩子在运费的标题后面增加一小段描述。如果你的运费数量不多且比较固定,这段代码就足够用了。

那么如果一个网站有很多种运费,并且经常会修改运费种类,上面这种hard codding的写法就会变得很臃肿且不易维护了。我们就需要给每个运费添加一个自定义的描述字段,实现后台管理描述,方便运维人员自己去修改运费设置。 查看详细 »

阿里云企业邮箱用于网站邮件SMTP的正确设置方法

我有不少客户是在阿里云注册的域名并购买的邮箱,写这篇文章是为了提醒大家,如果你的网站需要用自己的企业邮箱作为发件箱,务必需要正确设置自己的邮箱。

首先,如果你和我一样是用WordPress建站,通过Gravity Forms或CF7这些表单插件发件的,可以看一下我很久以前的这篇文章: WordPress以及表单插件Gravity Forms和Contact Form 7无法发送邮件问题解决。这篇文章告诉你在网站后台如何正确的设置SMTP邮箱服务。但是假如作为发信源头的邮箱本身没有设置好SMTP服务,那么网站后台即使设置正确了,也是没有效果的。

如果你用的是阿里云的企业邮箱,无论是免费版还是付费版本,都需要看一下这里。首先,注册完企业邮箱后,系统会自动生成一个名为“postmaster”的账号:
查看详细 »

WordPress后台开发,无插件增加一键复制文章页面功能

这次要实现的功能是在WordPress后台的文章列表中,添加一键复制文章的按钮。完整地复制一篇文章,除了要复制文章内容外,还要复制文章所有的分类信息和关联字段,这是复制功能的核心。另外要实现这个功能还要带上一些后台的交互,为了避免不小心点到这个按钮徒增不必要的数据,还需要做个二次确认框,效果是这样的。
WordPress后台开发,无插件增加一键复制文章页面功能

先要通过post_row_actions钩子增加一个”Duplicate”按钮(其实是个链接)

1
2
3
4
5
6
7
function brain1981_duplicate_post_link( $actions, $post ) {
	if (current_user_can('edit_posts')) {
		$actions['duplicate'] = '<a href="###" data-url="'. wp_nonce_url('admin.php?action=brain1981_duplicate_post&post=' . $post->ID, basename(__FILE__), 'duplicate_nonce' ) . '" title="Duplicate it" rel="permalink" class="duplicate-trigger">Duplicate</a>';
	}
	return $actions;
}
add_filter('post_row_actions', 'brain1981_duplicate_post_link', 30, 2 );

查看详细 »

WordPress+WooCommerce保险网站案例,我能把WooCommerce定制到什么程度

最近几年有很多人找我们咨询WordPress+WooCommerce建立外贸电商网站,其中大部分人在找到我之前,并不了解我和市面上大部分其他在用WordPress的建站团队或公司在服务和技术上有什么分别。于是我打算写几篇案例分享,来展示我们对于WordPress以及WooCommerce能做到怎样大部分其他人做不到的程度。

今天的话题是一个保险网站的案例,这是一个面向留学美国高校人群的保险售卖网站,学生(或家属)需要购买医疗保险,于是Ta登录该网站。

首先,用户选择Ta所在的学校和自己的出生年月。网站已经内置了全美绝大部分的学校资料,输入简单的关键词或者学校简称,即可搜索到对应的学校:
查看详细 »

WordPress自定义上传文件最大容量(size)的几种方法

这篇文章仍然拿上传文件做话题,因为最近用WordPress做交互站比较多,对这块研究得算是比较深了。

WordPress有自带的上传文件最大值限制,这个限制,到后台的“工具”-“站点健康”-“信息”页面可以查到,受制于服务器环境影响,不同的网站限制的大小会有所不同,比如这个网站是40M:
WordPress上传文件最大容量size

如果要修改这个限制,首先要到服务器环境下的php.ini配置文件中查看相关设置,找到这一行,修改后面的数值。
upload_max_filesize = 80M
post_max_size = 80M
memory_limit = 256M
查看详细 »

WordPress开发者自定义附件上传目录的几种方式

WordPress默认的媒体库,即附件上传路径在站点目录的/wp-content/uploads/路径下。WordPress官方提供了两种文件组织方式,一种是按年分,一种是按月分。个人博客网站,内容不多的,考虑按年会比较好管理;如果是更新频繁的咨询站、电商站则推荐按月分文件夹。因为如果单个目录下文件太多,会发生ftp无法索引的问题,这个问题我曾写过一篇 文章 讨论。
WordPress自带的附件管理设置

大部分情况下我们不需要修改默认的文件上传路径,但在以下情况下就会产生这样的需求:
1. 前端不直接暴露附件路径的付费下载站;
2. 交互类网站允许访客上传附件的,不希望和站长自己上传的附件放在同一路径下;
3. 有意隐藏WordPress信息的,即不希望他人通过路径特征知道我们是用WordPress建的网站。 查看详细 »

WooCommerce无插件增加优惠券功能,限定/禁止给指定用户角色(role)使用

WooCommerce提供了基本的优惠券Coupon功能,优惠券可以限定/禁止使用的产品、产品分类、限定最小和最大金额等,这些功能很实用,但仍然比较单薄,尤其是对指定用户的限制很弱,只能限定给指定邮箱的用户使用。邮箱可以使用通配符比如*@google.com,这可能比较符合国外网站的运营习惯,但对我们来说不太直观好用。我们通常希望实现的是给指定用户等级设定优惠券的使用或者禁用。本文记录如何开发出这个功能。

先看下结果:
WooCommerce无插件增加优惠券功能,限定/禁止给指定用户角色(role)使用

图中倒数第三行是WooCommerce自带的邮箱设定,最后两行就是我添加的功能,指定优惠券对某些用户等级(role)的使用和禁用。 查看详细 »

H5微信分享JS/后端PHP完整版代码

有差不多一年没有接H5的开发了,最近又接了一个,发现以前写过的微信分享部分不管用了,踩坑,又踩坑了!

首先是服务号的设置问题,我已经在这篇老的博客里更新:https://blog.brain1981.com/1784.html
此处重复一遍更新的内容,IP地址白名单从前可以不填,现在必须填写了,要不然死活调试不出分享,开发者工具会显示无权限获取access_token!
服务号后台必须填写IP白名单

第二个坑是微信已经更改了分享机制,如果你是点击URL进入H5页面,那么这时候即使分享请求正确,分享出去的都只能是一个文本的URL,而不是卡片式的分享格式。相关讨论和通知见这个链接:https://developers.weixin.qq.com/community/develop/doc/0000ea53f1cf60dcfc1da027a55c00
一度我还以为是微信又出了什么隐藏bug,明明debug模式和开发者工具都显示分享请求成功,死活分享不出卡片… 这也是微信的老毛病了,你说它没通知开发者么,倒也不尽然,但这种政策更改的通知就是不给你用白话讲清楚,要你自己去体会效果!

最后一个坑,是暂时没有爆的,但相信很快会爆,之前的两个分享接口 wx.onMenuShareTimeline 和 wx.onMenuShareAppMessage 即将被废弃了。需要换成 wx.updateAppMessageShareData 和 wx.updateTimelineShareData, 调用方式和参数大致没变。注意是大致没变,如果只是照搬替换,很可能又要踩坑,为造福广大苦逼码农,本文直接附上可以直接拿来用的分享代码。 查看详细 »

作为一名用WordPress建站的开发者,我为什么坚持尽可能少用插件?

用WordPress第十个年头了,做为一个老玩家,并且已经把WordPress作为重要谋生手段的我,今天想聊聊我对WordPress自己的理念。这些理念并不是出于一时的兴起或者道听途说形成的,而是基于我自己使用WordPress这十年的个人感受和经验,基于我自己对WordPress的学习历程,从无到有,再经过一些转折而形成的。我并不想做一个倚老卖老的说服者,企图说服大家接受我本文标题的观念,我只是想阐述,为什么在使用WordPress若干年头后,我会形成这样的想法。

一年前,我曾写过这样一篇文章 我用WordPress建站,为什么不用Elementor、The 7、Avada、Divi之类的主题和插件,本文是那篇文章想法的扩展,如果你不同意那篇文章,大概率也不会同意本文。

起初,我是怎么喜欢上WordPress的?
和所有人一样,基于WordPress开箱即用的可用性和方便的扩展性。对这两个特性的最初理解,就是我觉得网站缺少什么功能,大都能很快找到插件,安装上,再设置一下,就能马上启用,这真的太方便了。举个例子,这个网站,最初就是打算用来做我的技术博客的,写技术文章当然要贴代码段啦!WP主题没有适合代码格式的写法,怎么办?后台搜一下“code syntax”,就有一大堆插件可以选,大部分都很好用,选一个安装用户最多的装上就行了。再比如,我嫌默认主题的文章的分页不太好看,搜一下“page navi”,又有一大堆插件可以选,逐个打开他们的主页,选一个看上去最顺眼的安装上,就好了。于是,在最初,我理解的开箱即用,和扩展性,都是WordPress数以万计的插件带来的。以至于在最初的一两年里,想要实现一个什么功能,我都会直接找插件装上,随着使用过的插件越来越多,也逐渐觉得自己就是个WordPress的“专家”了。 查看详细 »