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给出的评价都是片面的。 查看详细 »

在Chrome浏览器里开启被屏蔽的Flash插件

由于谷歌Chrome浏览器已经宣称停止对Flash的支持,我们在2009年制作的Flash版JennyStudio官网已经无法打开了,如果你在Chrome里访问这个地址:https://www.becomingjenny.net/formersites/flash.htm 会吃到这样一个闭门羹:

嗯,虽然我们已经不在这一版网站里更新案例了,但看着还是有些心疼,所以这里写一下如何在Chrome里重新开启Flash插件支持,好让我们的这个旧作还能重见天日。

首先在Chrome地址栏复制粘贴这个地址:chrome://settings/content 进入Chrome设置页面
在上面的搜索栏里输入Flash,然后点击“网站设置” 查看详细 »

LNMP自动生成Let’s Encrypt ssl证书失败问题解决记录

今天在给一个新网站生成SSL证书的时候,系统提示
Couldn't download https://raw.githubusercontent.com/certbot/certbot/v1.5.0/letsencrypt-auto-source/letsencrypt-auto.

搜索了一圈解决方法,提示是certbot这个版本太老,自动升级的那个URL又失效导致的

其实我只是装一个免费证书应该很简单,老的脚本能用就行,根本没必要因为安装脚本不能升级就卡在那里,那么应该只要禁用这个脚本的自动升级,让它不去请求那个已经打不开的URL就行了。根据这个思路,找到lnmp的脚本文件,我这台主机的lnmp版本是1.4,在“/usr/bin/lnmp”下,打开这个文件,找到这一行
/bin/certbot certonly --email ${email} --agree-tos -n --webroot -w ${vhostdir} ${letsdomain}
改成:
/bin/certbot --no-self-upgrade certonly --email ${email} --agree-tos -n --webroot -w ${vhostdir} ${letsdomain}
然后重启一下lnmp,再运行lnmp ssl add命令,这下就成功完成了证书安装

我的LNMP版本较老,当前最新版LNMP1.7没有这个问题。对于使用LNMP配置WordPress环境的用户,一般都建议选择最新版的CentOs镜像,安装最新版LNMP,可最大限度地规避这些过时的兼容问题。

给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。

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

Linux主机丢失MySQL的root账户密码,重置密码步骤

有一段时间未登录的测试机,发现MySQL的root密码找不回了,整理一下网上搜的办法重置密码,记录一下步骤。

SSH登录到服务器,找到MySQL配置文件/etc/my.cnf,在[mysqld]这一行下面添加一行:

skip-grant-tables

保存后,重启MySQL:

service mysqld restart

然后就可以用无密码方式登录MySQL了
在mysql命令符后,留意一下系统提示的MySQL版本号,执行语句

#MySQL5.7以下版本
UPDATE user SET Password = password ( 'abcd1234' ) WHERE User = 'root' and Host='localhost';

#MySQL5.7和更新版本
update user set authentication_string=password('abcd1234') where User='root' and Host='localhost';

#退出
quit;

密码abcd1234只是示例,尽量改复杂一些。

然后再打开my.cnf文件,去掉刚才加的那一行,保存后再次重启MySQL,即告完成。

WordPress一次列出当前文章/页面的所有自定义字段

WordPress中最重要的活用就是自定义字段,它几乎涉及到了一切现有的业务模块,无论你是电商网站还是用户社区,自定义字段无处不在。有时候我们需要在别人现成的代码或主题里面挖一些资料,进行再开发。那么就需要知道特定的页面上究竟可以有哪些字段资源可用。

还是用我们熟悉的get_post_meta命令,但是这次只给一个参数,就能调出所有的自定义字段了:

1
2
3
4
$myvals = get_post_meta($post_id);
foreach($myvals as $key=>$val){
    echo $key . ' : ' . $val[0] . '<br/>';
}

就是这么简单!

———————
2023年10月更新:

在评论区有朋友留言反映用以下一行代码列出字段更为简单:

1
the_meta();

这个方法在single页面的主循环中使用确实很简单有效,但它目前已经被官方文档标为弃用了,官方也是推荐一律使用get_post_meta方法调用自定义字段:
https://developer.wordpress.org/reference/functions/the_meta/

另外,经过对比the_meta方法输出的字段会过滤掉开头为下横杠”_”的字段名称,这类字段通常都是WordPress和WooCommerce等插件的保留字段,比如WooCommerce的这几个自己开发排序必用的字段:
_price – 价格
_wc_average_rating – 平均分
_wc_review_count – 评论数
都不在the_meta方法输出项内,所以建议还是不要用它了。

网站链接规划,什么时候在新窗口/标签打开页面,什么时候在当前页打开?

这是一个老话题,最近正好被客户问起过,索性整理一下想法。

我们的设计原则:如果没有任何条件,一律默认在原窗口跳转

以下是条件

主观条件

如果觉得当前页面对你的转化比较重要,不希望用户关闭打断转化,就用新窗口。比如商城网站,用户订单页面上就等着付款了,要展示个条款页面,肯定是用弹出新页了。其他带表单的页面也是如此,在这样的页面上要少放链接。不过这个主观条件容易被滥用,有些人会觉得自己每个页面都是重要的…

客观条件

目标页面没有跳回原页面的链接的,原页面上这个链接就要用新窗口/标签打开目标页。比如跳到站外的,那肯定是要新窗口了。

补充

因为鼓励尽量在原窗口跳转,所以站内也要尽量做好内链,比如导航设置合理、下级页面有返回上级页面的专门链接、面包屑链接,等等…方便用户能快速找到原页面位置。总之设计中要活用各种方便用户逛网站的手段,防止迷路。

最后,电脑端对用户来说或许多几个标签页无所谓,手机端打开多标签就非常不方便了。手机浏览器切换标签麻烦,标签多了卡顿也明显,所以在手机端尤其要遵守在站内避免打开新标签的原则。在微信等APP内置浏览器中更是没有新标签的功能,一定要想好怎样只用当前窗口做交互。如果怕造成转化损失,可以有这样的手段:

– 如果新页面内容不多,可以考虑用浮层展示,避免掉这个跳转。
– 如果新页面内容多,必须跳转的,除了打开新标签,还可以考虑用本地存储、Cookie等手段保留用户在原页面的数据,比如填到一半的表单数据,方便用户回来后继续填写。

给Gravity Forms表单的电话号码增加11位手机号码格式

Gravity Forms提供了强大的表单系统,但是它的电话号码格式却没有11位手机号码的格式,虽然我们可以用International这个选项代替(就是不限制格式),但终归不够完美。查了一下官方文档,把这个需求给填上吧。

直接上代码:

add_filter( 'gform_phone_formats', 'brain1981_phone_format' );
function brain1981_phone_format( $phone_formats ) {
	$phone_formats['china mobile'] = array(
		'label'       => '手机号码',
		'mask'        => false,
		'regex'       => '/^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$/', //手机号码正则
		'instruction' => "11位手机号码",
	);
	return $phone_formats;
}

查看详细 »