文章分类: WordPress

全世界竟然有40%的网站是基于WordPress创建的!
博主对WordPress长期深入研究,并有着大量的实践案例,总结了大量的博文笔记,是一位WordPress“硬核”玩家。

WordPress文章字段查询meta_query各种高级用法列举

WordPress meta_query 高级用法

WordPress在get_posts或WP_Query方法中,活用meta_query,可以变换出无数种高级检索,是WordPress的入门技能。

最简单的用法,查询自定义字段“post_color”值为“red”的文章

$arr = array(
	'post_type', => 'post',
	'meta_key' => 'post_color',
	'meta_value' => 'red'
);
$myPosts = new WP_Query( $arr );

引入meta_compare参数,查询自定义字段“post_color”值不为“red”的文章

$arr = array(
	'post_type', => 'post',
	'meta_key' => 'post_color',
	'meta_value' => 'red',
	'meta_compare' => '!='
);
$myPosts = new WP_Query( $arr );

推荐写法

下面开始进阶用法,首先要换一种写法,把所有自定义字段相关的参数都打包到meta_query参数中,效果和上面一段一样:

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'post_color',
		'value' => 'red',
		'compare' => '!='
	)
);
$myPosts = new WP_Query( $arr );

查看详细 »

WordPress不用插件实现多张特色图片/缩略图Featured Images

WordPress的文章、页面或者自定义文章类型开启特色图片,通过注册这个类型时,在support中添加参数“thumbnail”实现,比如:

register_post_type('My CPT', array(
	'label' => 'my_cpt',
	'description' => '',
	'public' => true,
	'show_ui' => true,
	'show_in_menu' => true,
	'capability_type' => 'post',
	'hierarchical' => false,
	'rewrite' => array('slug' => 'product'),
	'query_var' => true,
	'supports' => array('title','editor','thumbnail') //这里有了thumbnail就能为my_cpt这个类型添加缩略图
	)
);

这个缩略图有没有可能变成多张呢?比如这样:

查了老半天,WordPress本身并没有提供多张特色图片的API,但这个功能完全可以通过自定义字段实现。本文即是这个原理 查看详细 »

基于WordPress的微信小程序支付功能开发

我在2018年的时候总结过一篇微信小程序支付功能开发与踩坑经验总结,当时因为网上相关文档和资源的缺乏,文章获得了很多关注和转载,并且也有很多人指出了其中的不足。主要不足之处就在于那篇文章把所有的签名字串封装都放到了前端,也就是小程序里,通过JS实现,其中还涉及到了商户key这样的敏感字段,因此是不安全的。不过在3年前微信本身对这块也没有做很严格的限制,比如我把对“https://api.mch.weixin.qq.com/pay/unifiedorde”这个接口的请求放在小程序里,那时候照样是能运行的。

近期,把小程序的基础库改成近期版本后,我发现“https://api.mch.weixin.qq.com/pay/unifiedorde”这个接口的请求已经不能放在小程序里了,即使此域名已经加入到request安全域名下也无效,微信那边会自动把你加入的这个域名过滤掉。这就表示一系列的请求必须放到服务器上完成了。因此我重新整理了一下后端的代码,PHP版本的。并且因为我的微信小程序都是基于WordPress做后端的,索性把自定义的接口这块也缝合过来。

当前最新版调试通过:

打包代码如下: 查看详细 »

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建站,为什么不用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个备案名额,且流程每年都在加长。但是阿里云自身服务规范且非常高效,其备案流程真的完胜国内任何一家其他服务商,没有例外。

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