文章分类: WordPress

全世界竟然有超过40%的网站是基于WordPress创建的!
博主对WordPress长期深入研究,并有着大量的实践案例,总结了大量的博文笔记,是一位WordPress“硬核”玩家。
本博客不做泛泛的插件、主题分享,博主致力于WordPress深入开发技术的研究,主张牢牢掌握WP核心的开发能力,尽可能脱离插件和主题的束缚。

WordPress JWT认证授权方式测试调研和开发心得

本文接上回WordPress OAuth 1.0认证方式测试调研,研究JWT认证方式。

JWT,全称JSON Web Token。在WordPress应用场景中,客户端通过JSON格式发送登录信息到WordPress网站,网站返回用户的基本信息,附带一串token给客户端;客户端在下次请求写入数据的时候,在请求头上带上这一串token作为用户标识就可以了。由于token是从网站发来的,客户端不需要做任何的数据处理,只要存储一下这一串token就可以了,很便捷。因为这种便捷性,国内用微信小程序或其他客户端连接WordPress的项目,大部分都是用JWT实现的,如果我说的不对请留言指正:)

使用JWT,先安装插件:JWT Authentication for WP REST API

然后在WP的根目录下修改wp-config.php,增加以下两行配置,开启JWT接口:
define('JWT_AUTH_SECRET_KEY', 'abcdefg...'); //填个复杂点随机字符串
define('JWT_AUTH_CORS_ENABLE', true);

以上准备工作完成,接下来回到Postman测试发送请求。

1. 发送用户名和密码的JSON格式到 https://www.mysite.com/wp-json/jwt-auth/v1/token

返回数据中,除了邮箱、用户名和全名外,注意第一行的token,需要在客户端存储一下,安全起见,推荐存在客户端的后端,尽量不放在前端。 查看详细 »

WordPress OAuth 1.0认证授权方式测试调研

这两天有新项目需要用到站外登录WP,操作WP网站的数据,之前在一些小项目中,通过Rest API操作网站数据,我都是通过Basic认证的。Basic认证有一个安全方面的缺点,就是每次发送请求,都需要把用户名和密码base64编码到请求的header里。这样就得在站外存储WP网站的用户名密码,如果在站外没有做好安全,不小心泄露这个登录信息,就会造成安全问题。为了规避这种漏洞,我的方式是在WP站内建一个秘密用户,只分配用得到的权限,用户在站外请求我的Rest API,如果要写数据,我用一个中转的节点,加上这个秘密用户的用户名密码组成的header去请求数据。当然,这当中还要加上识别用户的业务逻辑,比如用手机号码做用户字段,这就不另外展开了…

所以我重新考虑OAuth认证方式,谷歌了不少资料,网上大家比较公认的是这一篇:https://code.tutsplus.com/tutorials/wp-rest-api-setting-up-and-using-oauth-10a-authentication–cms-24797
如果你也研究过OAuth和Rest API,你应该也看过这篇文章或者它的翻译版本。

一开始我觉得跟着上面那篇tutsplus上的教程跑一遍就好了,也没必要特意写这篇文章去总结。然而实际操作过程还是踩坑了,所以需要自己记录一下,复盘一下跑通OAuth1.0的过程。本文无代码,都是测试截图。
查看详细 »

WordPress网站不安全总是被黑,有哪些安全策略?

知乎原答:https://www.zhihu.com/question/385295712/answer/1666754670

用WordPress开发的网站,如果被黑,99%都是没有升级造成的。这既包含了主程序更新,也包括插件和主题更新

主程序更新

WP主程序一定要保持最新,这是个老生常谈的话题了。WP作为市场占有第一的CMS,是有无数黑产盯着的,但是WP又是升级更新最频繁的CMS,每个月都有小到0.0.1的版本号升级,有时候还有多次,多是给安全打补丁。这就形成了一个有趣的现象:

最不安全的CMS:旧版本的WordPress
最安全的CMS:最新版的WordPress
查看详细 »

我用WordPress建站,为什么不用Elementor、The 7、Avada、Divi之类的主题和插件


我们去年有一个项目就是接手一个WordPress + Elementor做的企业站,而且是一家英国公司做的。客户嫌英国人后期服务响应太佛系,跟不上他们的需求,经过对我们工作室的一番了解后,就把网站全部包给我维护了。

原本我有个原则是不接烂尾项目,因为怕陷入“祖传代码”。不过看了下这个网站发现没有任何技术含量,除了一些css,英国人愣是一行自己的前后端代码都没写,所有的页面都是靠Elementor一格一格的“设置”出来的。加上客户付钱爽快,我就接下这活了。正好,用这个机会把整个网站都熟悉了一遍,了解了页面上每个模块是怎么通过后台,不写代码的实现出来的。这个网站给我的感受有两点,应该就是Elementor构建起的网站普遍的感受:

1. 速度慢

前端还好,这只是个企业展示站,用静态化+CDN优化下,普通用户访问速度还能接受。后端则是慢得很。当然我知道如果光用Elementor,这速度也不至于慢到不能接受,但尝试过多语言(WPML)+ Elementor的人应该不多吧? 这速度就能刷新我的承受下限了。WPML的大查询量+Elementor无数细碎的设置读取,对后台的影响是很成问题的。这个网站的数据量也一直在增加,因为速度变得不可维护的日子会越来越近。 查看详细 »

WordPress前端,自制拖放区域上传文件的轮子

上个月写过一篇WordPress通过Rest API自定义附件上传接口,那篇文章主要介绍了如何打通前后端,利用Rest API保存“抓取”已知URL的文件。不过在更多的情况下,我们还是需要通过自己的表单上传文件。正好这个月有个项目,有个表单需要拖放文件到指定区域里,提交表单的时候上传文件。如果我用Gravity Forms给的文件上传域,它只有原生的点击选取本地的文件组件,并没有拖放选取文件的组件,所以这里就需要造一个轮子了。

先说结果,最后实现出来是这样子的:
WordPress前端,自制拖放区域上传文件的轮子

文件拖到区域上方,区域会变色;拖入后区域内显示文件名,判断文件格式和尺寸是否合规;点击清除,会重置区域。


查看详细 »

Yoast SEO插件恢复使用Meta Keywords的方法

Meta Keywords,其实就是SEO页面基本3要素“TDK”中的最后一个“K” – Keywords。在页面上大致表现为这样一行代码:

<meta name="keywords" content="关键词1, 关键词2, 关键词3" />

其实TDK已经是一个过时的概念了,因为这个Keywords关键词在各大搜索引擎的作用已经被清零。所以在几年前,老牌的WordPress SEO插件Yoast SEO就已经取消了对页面上Meta Keywords的支持,具体为什么,可以移步看一下这篇文章:https://yoast.com/meta-keywords/

并且,Yoast连相关的钩子都去掉了,见这里:https://github.com/Yoast/wordpress-seo/issues/8775

但是我们国内建站行业中,有很多半吊子的SEOer,仍然把TDK这个概念奉为圭臬;也有一些网站站长自作聪明,动不动就在页面上堆砌十几个关键词。而我们用最好的SEO插件Yoast SEO,因为早已经摒弃了这个设置,所以是无法给页面添加Meta Keywords的。那么在无法说服这些客户的情况下,如何给页面添加这些关键字呢?我还是琢磨出了一点办法。 查看详细 »

WordPress+WPML通过AJAX读取指定语言的文章

WordPress+WPML多语言网站中,如果用get_posts / WP_Query这这些方法返回文章,默认都会返回当前页面所在的语言的文章。如果要跳出当前页面指定的语言,或者如果当前页面并不在WPML管理下,没有指定语言,那么get_posts / WP_Query默认返回的是网站默认语言的文章。

假如我们网站默认语言是英语,但还有第二种语言是中文,我想在英语的页面只显示中文文章,WPML有一个快捷办法:

global $sitepress;
$lang = "zh-hans";
$sitepress->switch_lang( $lang );

通过$sitepress->switch_lang方法,可以切换当前页面的默认循环语言。

有了这个方法,我们也可以在WP的Ajax接口中切换语言了。本文记录一个通过Ajax接口获取文章的范例。 查看详细 »

用WordPress建站,我是怎么选主机的

本人深度使用WordPress开发网站、微信小程序加起来有七八年了,用WP完成的项目上百个。说一下我对主机的选择。

分两种情况,中国大陆内(需要备案),中国大陆外(含港澳台,不备案)。

中国大陆内

只推荐阿里云。我曾用过新网、微软Azure(国内叫做世纪互联)、阳光互联、网宿 这几家的云主机。本人直观感受,这几家和阿里云比,都是××。

国内建站选主机服务商,主要考虑的事情有3点:
1. 备案平台方便高效;
2. 云端网站后台功能全,用户体验合理;
3. 主机运行稳定。

备案一直是小白站长头疼的事。且现在备案的确越来越麻烦,如果你选其他云服务商,且你是个新手没有经历过备案,其备案流程和操作能让你恶心很长时间。迫于管局的压力,阿里云的备案现在也在收紧限制,从以前的随便申请,到现在一台ECS必须买3个月才能提供5个备案名额,且流程每年都在加长。但是阿里云自身服务规范且非常高效,其备案流程真的完胜国内任何一家其他服务商,没有例外。

云端网站后台功能,阿里云是最全的,在国内也没有例外。这个东西是基础建设,需要巨大的投入,比得是公司实力,这一点目前就没有任何一家能和阿里云相比了。你去新网、电信云、或者任何一家其他的提供云服务的网站注册一下看看,和阿里云比真的让人失去使用愿望。不过我也去腾讯云看过,虽然后起,但毕竟背靠大厂,而且有微信小程序生态圈的加持,腾讯云其实可以作为第二选择,以后能不能赶超阿里云,还不好说。 查看详细 »

WordPress通过Rest API自定义附件上传接口

有没有想过用WordPress来建立自己的文件存储空间,当作自己的网盘使用?这个业务实现的主要逻辑其实就是自己写一个Rest API接口上传文件到WP的媒体库中。

首先我们需要安装一个插件,这个插件很小,只是给网站后台登录提供Basic认证,并不是用来拓展业务接口的。开通了Basic认证方式,我们才有途径获得使用Rest API更新网站内容的权限,否则Rest API只提供读取权限。插件名称叫做JSON Basic Authentication,官方下载地址:https://github.com/WP-API/Basic-Auth

要做接口,就先创建endpoint。这次我创建两个,一个是用来转存网上的文件的,一个是用来自己上传文件的。

add_action( 'rest_api_init', function () {
	//如果你不打算把文件存到WP默认的位置,这是修改位置的钩子
	add_filter( 'upload_dir', 'brain1981_upload_dir');
 
	//转存
	register_rest_route( 'brain1981/v1', '/catch/', array(
		'methods' => 'POST',
		'callback' => 'brain1981_api_post_catch',
	) );
	//上传
	register_rest_route( 'brain1981/v1', '/stream/', array(
		'methods' => 'POST',
		'callback' => 'brain1981_api_post_stream',
	) );
});

查看详细 »

让国内用户也能在Gravity Forms中开启谷歌验证码Google reCAPTCHA功能

我一直认为Google reCAPTCHA是最好的表单验证插件,没有之一。
在Gravity Forms中开启谷歌验证码Google reCAPTCHA功能

Gravity Forms作为WordPress界最强的表单插件之一,也提供了免费的表单验证功能,它接入的也是Google reCAPTCHA,可惜国内用户是无法直接使用的。因为谷歌API在原有域名下均已被阻断,但是部分有用的服务比如验证码、字体等,其实是有其他备用域名可以使用的,而Gravity Forms似乎并不太关心我们国内用户,所以就没有提供采用备用域名接口的选项,需要自己手动调整。 查看详细 »