是不是所有的企业都需要花钱投资设计?

本文源自我在知乎的一篇回答,略有修改。原答链接:https://www.zhihu.com/question/507937340/answer/2285849519

我们算是设计行业的一员,但不得不承认在某些时候,过度设计会是一种浪费,因为好的设计肯定是要花钱的,而对于一些不需要设计就能高效获客的场景,你的确(暂时)不需要太注意页面设计。

这种场景哪里有?举个例子,在一个小县城做垂直业务,比如开锁、卖肥料、装摄像头…如果你是这个地区这个业务唯一的网站/小程序/APP,只你一家,那你就可以不必花钱做设计了。但若是有任何一个竞争对手出现,他的网站看起来比你漂亮专业,你就得开始弥补设计短板,要不然客户很快会被对手抢去。 查看详细 »

WordPress优化,前端删除classic-themes.min.css的引入

WordPress 6.1是近期发布的版本,如果你持续关注WordPress的更新和对网站的优化,会发现更新到6.1版本后,会多引用一个名为classic-themes.min.css的样式表。

该样式表很小,里面只有一条对按钮的定义,对网站并不会造成明显的影响,但毕竟是多引入了一个通常都无用的文件。本着“应优化尽优化”的原则,我们可以取消对改样式表的引入。 查看详细 »

woocommerce_order_item_product函数过期问题,寻求替代函数的解决方案

woocommerce_order_item_product这个函数,在很多插件里都用到过,但是这个函数自从WooCommerce 3.0版本就开始过期了,如果你用的插件或者主题里还包含了这个函数,会产生一个这样的报错:“woocommerce_add_order_item_meta is deprecated since version 3.0.0! Use woocommerce_new_order_item instead”

尽管报错信息里提示用woocommerce_new_order_item函数代替,但实际上woocommerce_new_order_item函数的参数和woocommerce_order_item_product并不完全相同,不能靠直接替换函数名称来解决问题。

之所以写这一篇博客,是因为我之前的一篇关于产品自定义字段的博客里有代码遇到了这个报错。这里重新贴一下这段代码:

//6.在订单中保存自定义字段
add_action( 'woocommerce_add_order_item_meta', 'brain1981_product_add_on_order_item_meta', 10, 2 );
function brain1981_product_add_on_order_item_meta( $item_id, $values ) {
	if ( !empty( $values['my_custom_addon'] ) ) {
		wc_add_order_item_meta( $item_id, 'my_custom_addon', $values['my_custom_addon'], true );
	}
}
//from: https://blog.brain1981.com

查看详细 »

WordPress用子目录形式在Nginx服务器配置多站点(Multisite)的流程和避坑

写在前面,WordPress多站点并不适合初学者,而对于熟悉WordPress开发的人来说,也应该慎用。WordPress多站点本身是一个比较理想化的解决方案,它在某些维度上简化了拥有多个网站的站长的管理流程,节约了服务器的空间;但它也增加了一层系统结构上的复杂度,使你在操作网站搬家、迁入等大的维护工作的时候容易踩坑。比如对于数据库,如果是单个WordPress网站搬家,我通常只要直接导出数据库就行了,而对于多站点中的子站点就需要做一些额外工作了。本文只讨论WordPress多站点的建立流程,因为我最近正好又为一位客户实施了一次,可以完整滴梳理一下实施过程和容易出错的地方。

WordPress多站点有两种形式,子域名和子目录。这次要配置的是子目录形式,也就是站点一是abc.com/site1 ; 站点二是abc.com/site2 这种形式。

首先,到原站点的设置 – 常规 页面中,把站点地址由原来的 abc.com形式,添加你需要的子目录名,变为 abc.com/site1,并保存设置。此时你访问 abc.com,浏览器会自动跳转到 abc.com/site1 。 查看详细 »

WordPress后台开发,无插件添加列表页快速编辑(Quick Edit)自定义字段

这次的文章标题有点拗口,其实用一张图概括就是这样的:
WordPress无插件添加列表页快速编辑(Quick Edit)自定义字段

在文章列表页,点击“快速编辑”,展开的选项栏叫做快速编辑栏。我们可以把一些经常要修改的文章字段放到快速编辑栏里,这样就可以在列表页直接修改这些字段,而不用进入下级的文章页了,可以从而节约时间。 查看详细 »

WooCommerce微信小程序开发,为Rest API补充图片信息

WooCommerce微信小程序开发使用WooCommerce的原生Rest API,接口中是缺少一些必要的图片信息的,这里列举两个地方:

1. 产品接口中,所有的产品图片都只有原图URL,没有带上thumbnail和其他WordPress生成的尺寸

通常商店管理员并没有太多图片的优化意识,会直接把多达几M的产品图上传。WooCommerce的主题多半会生成一些必要的小尺寸图片分别给产品列表以及购物车等地方加载,但Rest API中并不会有这些信息。微信小程序的产品列表页也是需要这些小图的,于是我们需要在接口中把这些小尺寸产品图也加入进去: 查看详细 »

Sublime Text修改边栏Sidebar的字体大小

这几年我写代码的工具一直都是Sublime Text,这两天给自己的电脑换了一台27寸的4k屏显示器,本想着一屏可以多显示几行代码,还能同时多窗口并列,这样写起代码来因该会很舒服。然而并没有那么简单,现在27寸并不是什么大尺寸显示器,在3840分辨率下,操作系统界面都显得非常“袖珍”,用起来很费眼睛。于是我只能把系统字体调成了150%,解决了大部分软件的界面字体问题。

这里的大部分,就没包括Sublime Text。Sublime Text的代码部分,可以通过Ctrl + +/-灵活调节字体大小,然而左边的文件列表就不行了。于是搜了一下修改方式,这里做个记录。

按ctrl+shift+p打开插件列表,搜索Install Package,等待软件搜索仓库信息(在底部状态栏有提示)。等加载完毕后,再搜PackageResourceViewer,并选中间那个Open Resource。

查看详细 »

给WordPress的dashicons添加自定义图标

Dashicon是WordPress本身自带的一套图标系统,它满足了WordPress后台对小图标的需求,但也仅仅是满足了WP自身的后台使用而已。为了避免不必要的冗余,WordPress官方也并没有打算把它打造成一套丰富的图标,而是把这个空间留给了开发者和设计师。如果你开发的插件需要在WP的后台新建菜单,或者你的网站有着各种自定义的Post类型,那么你可能就需要添加自己的图标了,毕竟,WP自带的图标库中,去掉WP正在使用的那些,可选的真是不多。

生成新的Dashicon,可以借助一个网站 – Glyphter。网站本身就提供了一些图标给你添加,这些图标都是开源的,可以免费使用,其中就包含了Font Awesome以及众多其他有名的图标库:
给WordPress添加自定义Dashicon - Glyphter的图标库 查看详细 »

WordPress项目 – WooCommerce微信小程序定制开发


最近上线的一个项目:WooCommerce定制微信小程序。基于之前的WordPress的网站(也是由我开发)后端,利用WordPress和WooCommerce的扩展能力,定制了小程序使用的API;小程序的前端则是从无到有的独立开发。能对WooCcommerce做到这样的定制扩展的建站商非常少,我们的技术优势在此项目中得到了充分体现。
查看详细 »

WooCommerce购物车对象使用以及方法函数概括

WooCommerce二次开发中,经常会需要对购物车进行改造,甚至有时候会需要重写购物车页面,所以就有必要把WooCommerce的购物车提供的接口方法做一下整理。本文对我在最近的一些项目中使用过的方法进行简要的记录。

首先,在调用任何购物车方法之前,先要检查当前页面环境对购物车对象是否可用:

1
2
3
4
if ( is_null( WC()->cart ) ) {
wc_load_cart();
}
WC()->cart->get_cart();

常用的条件函数,返回true/false

1
2
3
4
5
6
7
8
9
10
//检查购物车是否有商品
WC()->cart->is_empty();
//检查购物车是否需要付费,如果费用为0则返回false
WC()->cart->needs_payment();
//检查购物车中是否已经记录收货地址
WC()->cart->show_shipping();
//检查是不是需要寄送(用于计算运费的情况)
WC()->cart->needs_shipping();
//检查是不是有折扣,如果后台减了价格,这里会返回true
WC()->cart->has_discount();

查看详细 »