文章分类: WordPress

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

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似乎并不太关心我们国内用户,所以就没有提供采用备用域名接口的选项,需要自己手动调整。 查看详细 »

WordPress AJAX玩法,通过自带的AJAX钩子和通过Rest API两种方法对比

更新于2020年5月2日:本文第一版有一些概念错误,现已修正

基于WordPress项目的开发中,经常会需要用到AJAX请求。相较于原生的前后端实现,WordPress其实提供了两种方法可以更便捷的实现AJAX。

WordPress自带的AJAX钩子实现AJAX

这个方法是现在用的比较多的。原理是前端向“/wp-admin/admin-ajax.php”这个接口发送请求,这个接口会根据请求的action值来处理数据。而根据不同的action值,利用钩子“wp_ajax_nopriv_[action]”和“wp_ajax_[action]”去编写自己的程序处理和返回数据。
如果是要写数据,先在页面生成nonce:

1
$xprofile_nonce = wp_create_nonce ('xprofile_nonce');

查看详细 »

WordPress真的比Wix或Shopify好吗?

今天在知乎上回答了一个我以前也被问起多次的问题,在此也发布一下自己的回答(略有修订)。
原答链接: https://www.zhihu.com/question/358785933/answer/1172467957

都2020年了,庞大的WordPress网站基数中,仅仅是博客的这一类网站占比已经不高了!

不错,WordPress一开始就是个博客(大约10年前)。然而现在用WordPress已能够很专业的搭建:
商城(b2b、b2c都可以);
社区(bbs,或者知乎这样的问答社区);
传统各行各业的企业网站(这类我已经做了上百个了)。

即使是做博客网站,WordPress也早就不是个人发布发布文章这么简单了,你可以用来搭建公共博客、wiki类型的,微博类型的。WordPress的博客,在更多时候已经变成了任何更复杂类型网站的一个常规附带。总之只要是市面上已经有成功案例的网站,WordPress都能模仿出它的业务原型。

然而,我们常见的情况是WordPress似乎都是小团队或个人在用,所以开发人员总体水平显得不太高,或者说用WordPress建站的企业本身对技术的投入就不高,所以做出来的低质量网站很多;另一方面,个人WordPress站长也很多,个人站通常自给自足,难看点也很正常,所以整体拉低了WordPress的案例水平。另外,很多人对WordPress的期待就是装个主程序,选个主题,再装几个插件就能弄出想要的网站,根本没有深入的研究WordPress到底好在哪里,或者还有哪些不足。这样的人,他们虽然用过WordPress,但是对WordPress给出的评价都是片面的。 查看详细 »

给Gravity Forms表单添加定制级联菜单,中国城市选择选项

Gravity Forms(重力表单插件,本文简称GF)是一款公认十分强大的WordPress表单插件,不过其强大之处在我看来并不是选项多,操作简单等常规“小儿科”特性,这一点其实很多其他的表单插件都能做到。GF强大之处在于它提供了十分周全的API和文档让开发者能做进一步开发,满足用户更复杂的业务需求。这一点恐怕没有其他竞品可以与之相比。

表单插件虽然多,提供级联下拉菜单的表单插件恐怕就很少了。GF本身也没有提供,不过用户可以通过逻辑功能绕道在后台实现简单的级联菜单,方法是先放入一个一级菜单,再放入N个二级菜单,二级菜单默认全部隐藏,根据一级菜单的选项来显示对应二级菜单。这种实现方法比较直观,但如果一级菜单选项很多,那添加和维护就很吃力了。于是我尝试用GF提供的API自己定制一个级联菜单,选择中国所有34省级行政区下的对应城市/区。总共34个一级选项,五百多个城市子选项,这要在后台一一添加可真的是非常麻烦了。

先上结果图:
给Gravity Forms表单添加定制级联菜单,中国城市选择选项
查看详细 »

给WooCommerce的订单页面添加自定义字段,并输出到管理员通知邮件中

给WooCommerce的订单页面添加自定义字段其实这也算是一个常见需求,有些人喜欢一碰到这类需求就找插件实现,其实大可不必。在WordPress里面找对钩子,添加对应的代码段就行了。

今天刚完成一个小需求如下:在WooCommerce的Checkout页面增加一个了解用户渠道的下拉字段,并且如果选了”Others”选项,会再多出现一个文本字段。下拉字段为必填,多出的文本字段为可选,效果如图:

查看详细 »

WordPress自定义文章类型自由调用不同模板的方法,给自定义类型后台添加模板选择列表

WordPress自定义文章类型调用模板有一个默认规则,即优先调用当前主题目录下的single-[type_name].php,这里的[type_name]为自定义类型的名字。比如自定类型为product,那么就优先调用single-product.php;如果single-[type_name].php不存在,则调用single.php;single.php不存在则调用index.php

对于列表页来说,则优先调用主题目录下的archive-[type_name].php;archive-[type_name].php不存在,则按顺序查找archive.php、index.php。

如果希望指定某个自定义文章类型调用某个模板,实现代码为: 查看详细 »