文章分类: WordPress

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

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)的使用和禁用。 查看详细 »

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

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

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

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

WordPress无插件,无残留完全禁用古滕堡Gutenberg编辑器

古滕堡(Gutenberg)编辑器在WordPress 5.0版本时就开始了默认开启模式,且无关闭选项。这个被称作WordPress划时代更新的部件,其实很多人和我一样根本用不着,因为这玩意速度实在太慢了,尤其对于我这种对性能很在意的开发者来说,是难以忍受的。如果要对页面写快级布局,大家都知道我肯定是手写代码的,根本用不着这种繁琐的页面构建器。关闭古滕堡编辑器可以通过官方指定的Classic Editor插件实现,安装这个插件后文章和页面就自动恢复到了经典编辑器界面。不过在小工具(Widget)界面下,仍然默认的是古滕堡编辑器,如果也要恢复到经典编辑器界面,你还得再装个插件 Disable Widget Block Editor

所以,为了用回WordPress的传统界面,你就得多装两个插件。这不是又给了那些喜欢诟病WordPress臃肿的人提供吐槽的素材了么?

其实两行代码就能搞定,根本用不着装上面这些插件:

add_filter('use_block_editor_for_post', '__return_false', 10);
add_filter('use_widgets_block_editor', '__return_false', 10);

对比一下禁用古滕堡编辑器前后的小工具界面,我还是觉得传统界面更干净直观,速度也快:
禁用古滕堡Gutenberg编辑器前后的小工具界面
查看详细 »

WooCommerce网店促销,给促销价格添加自定义名称

双十一快要到了,接到客户的临时需求,是为他们的WooCommerce网店大促销做一些小修改。其中一个修改是给设置了促销价格的商品添加价格注释,就像以下这个样子。

很简单的一个需求,利用woocommerce_get_price_html这个钩子就能实现,代码如下:

1
2
3
4
5
6
function brain1981_change_product_html( $price_html, $product ) {
	if( $product->is_on_sale() ) {
		$price_html.='<span style="display:block;font-size:12px;font-weight:normal;color:#c98c4b;">双十一活动折扣</span>';
	}
	return $price_html;
}

查看详细 »

WordPress自定义文章类型和自定义分类共用同一个根路径slug

在WordPress中如果注册一个自定义文章类型(Custom Post Type),并且同时为这个类型注册一个自定义分类法(Custom Taxonomy),两者使用同一个根slug,访问这个类型的页面就会发生404报错。

这个slug具体指什么呢?举例说明:
https://www.my-site.com/product/123.html
https://www.my-site.com/product/term-name

以上URL分别作为product类型页面的详情页和分类列表页,URL中的product就是根slug。在使用register_post_type注册product文章类型的时候,代码体现为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
add_action('init', 'create_product_post_type', 0);
function create_product_post_type() {	
	register_post_type('product', array(
		'label' => 'Products',
		'public' => true,
		'show_ui' => true,
		'show_in_menu' => true,
		'capability_type' => 'post',
		'hierarchical' => false,
		'rewrite' => array('slug' => 'product'), //注意此行
		'supports' => array('title','editor','thumbnail'),
		'labels' => array (
			'name' => 'Products',
			'singular_name' => 'Product',
			'menu_name' => 'Products'
			)
		)
	);
}

注意第11行的rewrite参数,就为此自定义类型指定了根slug,即形成如下url:
https://www.my-site.com/product/123.html 查看详细 »

使用WP Super Cache予取予求地刷新指定页面静态缓存

WP Super Cache是我一直以来都在使用的超级缓存插件,他可以帮我们的网站快捷的打开静态缓存,从而大大提高访问速度,节约服务器资源。本人切身感受,同一台服务器,在所有的WP网站都启用静态缓存,并且把图片视频字体等静态资源存入CDN后,服务器的利用率可以提高80%甚至更多。这款插件的设置技巧,搜索引擎上能找到一大堆,本文就不重复了。

本文讨论在某些应用场景下,如何有效地刷新单个页面的缓存。举个例子,一些博客网站有点赞功能,点赞的数据一般我们会作为一个文章自定义字段存储在数据库中,而页面上显示的赞数是在静态缓存页面里的,访客新点了一个赞,数据库里面的那个数字是+1了,但缓存过的页面并不会刷新这个数字,你按多少次F5都没用。

这时候我们就需要手动刷新一下显示这个赞数的页面静态缓存。访客不能进入网站后台,他自己如何刷新页面静态缓存呢? 查看详细 »

把WooCommerce产品购买数量的选项改为下拉菜单

WooCommerce产品数量的选项如图所示,这是一个HTML5的数字输入框,代码表现为

<input type="number" id="***" class="input-text qty text" step="1" min="1" max="" name="quantity" value="1" placeholder="" inputmode="numeric">

这样的输入框可以让用户输入任意数字,直接把一定数量的产品加入购物车。但在一些场合下,用户其实还是更希望有个下拉菜单形式的输入框,从而可以直接选择想要购买的数量。这种场合比较适用于购买数量不多,或者日常库存不多的产品,比如不超过20件的情况。因为如果数量一多,恐怕整个屏幕高度都不够下拉列表的数字显示,反而会对用户造成更大的不方便。

下来菜单其实就是一个select元素,替换掉原来的数字框,在商品页面的前后页面表现是这样的:

查看详细 »