普通视图

发现新文章,点击刷新页面。
昨天以前首页

WPJAM Basic - 样式定制:一键自定义 WordPress 前后台和登录页面

2025年5月6日 23:28

继续 #WPJAM Basic# 插件的详细介绍,前面介绍了「优化设置」还没有看的同学,可以先看一下,今天接着介绍「样式定制」的功能,「样式定制」也是 WPJAM Basic 最早开发的功能,开发这个功能主要是为了方便自定义网站。

简单说就是「样式定制」功能让用户可以在 WordPress 前后台和登录这三个主要不同的界面的头部(head)和底部(footer)插入一些定制代码,实现对网站页面样式和前端功能进行快速的定制。

因为是给三个主要不同的界面实现定制,那我们也分三个部分来讲解吧:

前台定制

前台定制的功能管的就是前台的页面了,通过前台 Head 代码前台 Footer 代码来定制前台的样式和功能。

这个功能对于有时候网站需要验证的时候有用,比如验证百度站长的时候,百度站长会给你两种选择:

  1. 让你在根目录上传一个 txt 文件
  2. 在头部的 Head 代码总加一段代码

如果不方便上传 txt 验证文件时候,直接把代码复制到这里的头部 Head 代码即可,即使方便的上传验证文件时候,把代码贴到这里也是更方便。

如果你的主题不支持暗黑模式,也可以通过把下面代码贴到这里的前台 Head 代码,也可以实现博客暗黑模式:

<style type="text/css">
@media (prefers-color-scheme: dark) {
html, img {filter: invert(1) hue-rotate(180deg);}
html, iframe {filter: invert(1) hue-rotate(180deg);}
img {opacity: .75;}
}
</style>

此外我在新版还增加了「文章页代码」选项,本来该功能是扩展,现在我把功能增加到「样式定制」功能中,因为这里使用起来比较顺手,不过做成了开关,开启可以单独设置每篇文章 head 和 Footer 代码。

先说下该功能的主要用途,主要是因为如果某些文章的展示的时候需要引入一些的 JS 和 CSS 来实现特殊的页面效果,怎么处理好呢?如果直接内容编辑框中插入,首先不是特别方便和友好,也可能由于安全或者其他的原因而造成插入失败。

「文章页代码」功能就是为该需求实现的,它可以让大家在文章编辑页面插入文章头部代码和底部代码:

另外他还可以让大家选择是否支持在文章列表页设置,有三个选项:支持,不支持,只允许,如果可以设置,在后台的文章列表页面中就有「文章页代码」按钮,如下图所示:

点击「文章页代码」按钮,就可以通过弹窗的方式来设置文章详情页的头部和底部代码:

后台定制

如上图所示,后台定制多了两个个功能,一个就是可以上传一个 40x40 大小的图片替换后台左上角的 WordPress 图标,另外一个是「后台右下角显示内存使用和 SQL 数量」,开启之后,在后台右下角显示:

其他和「前台定制」一样,也是通过后台 Head 代码后台 Footer 代码来定制后台的样式或者功能。

登录界面

登录界面也有两个额外的功能,首选是可以设置「登录之后跳转的页面」,比如可以设置网站首页,后台文章列表页面等等,另外一个是可以「屏蔽登录界面语言切换器」,这个不必多言。

其他一样可以设置 Head 和 Footer 代码,通过这两个值,可以做出自定义的登录界面。如果你懂 CSS,我们就可以自定登陆界面的 logo,甚至通过只用 CSS 就能做出非常漂亮的 WordPress 登录界面

关于样式定制,目前就提供了这些选项,基本满足简单定制的需求,该功能虽然偏向程序员使用,但是只要懂一些 CSS 和 JS,还是可以定制出很不错的 WordPress 后台,登录界面和前台的样式和交互。

WPJAM Basic - 优化设置:一键优化和增强 WordPress 功能

2025年5月6日 22:42

#WPJAM Basic# 插件的「优化设置」是 WPJAM Basic 插件的开端,可以说是我爱水煮鱼博客多年使用 WordPress 的经验而整理的优化插件。

我们 WordPress JAM 为了在定制开发的时候方便,就把各种用不上的功能,或者可能影响性能的功能,都提供开关,只需要一键搞定。

经过几年的发展,优化设置的功能分成功能屏蔽和增强优化两大块:

功能屏蔽

上图可以很清楚看到,功能屏蔽就是让你屏蔽 WordPress 中一些用不上的功能,我把功能屏蔽分成六大块:

常规功能

屏蔽文章修订功能,精简文章表数据。

WordPress 的文章版本修订功能是通过在 wp_posts 表中增加一条记录来实现的,这样如果修改了几次,就会有好几个修订版本,插入好几条记录。

如果经常修改文章或者博客有多个作者的话,每篇文章记录在 posts 表中都会有多条记录,文章一多,wp_posts 表的数据就会急剧上升,数据表的增大,最后自然影响了查询,肯定会变慢。所以建议屏蔽文章修订功能,提高数据库效率。

彻底关闭Trackback,防止垃圾留言。

Trackbacks 是被设计出来用于博客间交流,但实际上这样的应用很少,反而被 Spammer 滥用,并且各种防垃圾评论插件比如 Akismet 也经常漏掉,可以说防不胜防,Trackback 真的让人不慎其烦,建议彻底关闭 WordPress 的 Trackback。

关闭XML-RPC功能,只在后台发布文章。

XML-RPC协议用于客户端发布文章,如果只是在 WordPress 后台发布,可以关闭 XML-RPC 功能,提供 WordPress 的安全性。

关闭自动更新功能,通过手动或SSH方式更新。

WordPress 的更新服务器在国外,并且没有在国内开启加速服务,所以 WordPress 在后台检查更新的时候,可能因为各种原因无法顺畅连接上,然后一直卡着,造成 WordPress 后台有时很慢很慢。建议关闭 WordPress 后台和自动更新功能,通过手动或者SSH方式更新WordPress。

屏蔽站点Feed,防止文章被快速被采集。

WordPress Feed 主要用于阅读器使用,但是现在使用阅读器的用户越来越少,而 Feed 更多成为了一些垃圾站快速全文采集的方式,造成不必要的资源消耗,建议关闭站点 Feed。

屏蔽站点管理员邮箱定期验证功能。

WordPress 会在每六个月管理员再次登录之后,会看到站点管理员的邮箱地址验证界面,这是担心管理员的邮箱不再使用,引起一些安全的问题,让管理员再次确认,如果不会这方面的问题,觉得没有必要,可以屏蔽邮箱验证。

转换功能

屏蔽Emoji转换成图片功能,直接使用Emoji。

WordPress 使用图片来渲染Emoji表情文字,但是渲染图片经常打不开,并且现在主流浏览器都已经支持Emoji文字,并且现在绝大部分服务器的 MySQL 数据库(5.5版本之后)都支持 utf8mb4 编码格式,所以无需将 Emoji 转换成 HTML 实体进行存储了,直接存储速度更快,节省了实体转换的时间消耗。建议屏蔽 Emoji 功能。

屏蔽字符转换成格式化的HTML实体功能。

WordPress会将一些纯文本字符转换成格式化的 HTML 实体,但是这些转换并不适合中文环境,所以我们最好去掉这些字符转换,也能节约这些转换所消耗的时间。

屏蔽WordPress大小写修正,自行决定如何书写。

WordPress 默认会把 Wordpress 这样的写法转换成 WordPress,就是中间的 P 会变成大写。如果熟悉 WordPress 的用户,都会正确 WordPress 模式书写,所以从效率优先考虑,没有必要浪费时间在这个转换上面,一样一键移除。

后台功能

后台功能移除为欧洲通用数据保护条例生成的页面。

GDPR 是欧洲的通用数据保护条例,它制定了非常严格的隐私条例,WordPress为了适应该法律,在后台设置很多隐私功能,如果只是在国内运营博客,可以移除后台隐私相关的页面。

移除仪表盘的「WordPress 活动及新闻」。

WordPress 后台仪表盘页面会有「WordPress 活动及新闻」功能,但是大部分都是英文文章,如果你不想出现,可以一键移除。

移除后台界面右上角的帮助和选项。

WordPress 后台很多页面右上角,比如后台文章列表页面,都会有「显示选项」和「帮助」这两个按钮,一个是用来显示和设置该页面的选项,一个是用来获取该页面的帮助信息:

此图片的alt属性为空;文件名为1646055773-image.png

首先这两个按钮都在右上角,很多用户都不会特别注意,以至于自己操作了都忘记了,并且帮助文档对用户也帮助不大,建议两个都移除。

页面功能

页面功能移除页面头部版本号和服务发现标签代码。

WordPress 会在页面的头部输出版权信息和其他服务发现代码,版权信息代码会让用户知道你的目前运行的 WordPress 的版本,而服务发现代码则可以说明你的博客支持哪些服务。

这些代码在前台反而会引起一些安全的问题,最好一键去掉。

移除工具栏和后台个人资料中工具栏相关选项。

一般不建议在网站前台显示 WordPress 工具栏,所以可以一键移除。

嵌入功能

嵌入功能禁用Auto Embeds功能,加快页面解析速度。

Auto Embeds协议让你插入一个视频网站或者图片分享网站的链接,这个链接里面含有的视频或者图片就自动显示出来,但是该功能支持的网站都是国外的,如果运营的是中文博客,建议禁用 Auto Embeds 功能,加快页面解析速度。

屏蔽嵌入其他WordPress文章的Embed功能。

文章Embed功能让你可以在WordPress站点用嵌入的方式插入本站或者其他站点的WordPress文章。如果你不需要,可以屏蔽文章Embed功能。

古腾堡编辑器

屏蔽Gutenberg编辑器,换回经典编辑器。

WordPress 5.0 发布带来的 Gutenberg 编辑器,也叫区块编辑器,这个编辑器很酷,但是很多人不习惯,还是喜欢原来简简单单的编辑,name可以屏蔽 Gutenberg。

屏蔽小工具区块编辑器模式,切换回经典模式。

同样主题的小工具功能,新版 WordPress 也同样使用区块编辑器模式,你如果习惯了原来的经典模式,也可以一键屏蔽,切换回经典模式。

增强优化

增强优化主要将 WordPress 一些资源加速优化,并且添加一些常用的小功能,目前有以下的功能:

前端公共库

我们常用的 JS 库,比如 jQuery / Underscore 这些,网上都有提供免费的公共库,这里提供几个常用的前端公共库,可以根据自己的喜欢选择。

Google 字体加速服务

Google 字体很好用,很方便,WordPress 很多主题也使用了 Google 字体,但是 Google 在线字体在国内的速度不是很快,甚至有时候还无法打开,这也是 WordPress 有时候在国内速度不够快的原因。

WPJAM Basic 可以让选择第三方 Google 字体字体加速服务,也可以自定义输入加速服务地址:

详细介绍:使用 Google 字体加速服务,加快 WordPress 打开速度

Gravatar 加速服务

Gravatar 部分 CDN 服务器在国内访问困难,出现头像无法显示的问题,而 WordPress 后台或者评论页有时候默认加载 Gravatar 头像图片的,这样就可能造成页面卡死的情况。

WPJAM Basic 可以让选择第三方 Gravatar 镜像加速服务,也可以自定义输入加速服务地址:

详细介绍:使用 Gravatar 加速服务,加快 WordPress 打开速度

Frame 嵌入

WPJAM Basic 可以让你直接在后台设置 Frame 嵌入,避免点击劫持,增强网站的安全性:

详细介绍:如何防止 WordPress 页面被 Frame 嵌入

分类链接简化

去掉 category 的分类目录和 WordPress 的页面的 URL,这两种页面的页面rewrite 规则是不是一样的,那么我们可以直接使用页面的 rewrite 规则来处理了。

WPJAM Basic 还额外增加一个选项,如果博客自定义了其他的自定义分类模式,可以选择设置哪个分类模式应用该功能:

详细介绍:去掉 WordPress 分类目录 URL 中的 category 最佳方法

图片时间戳

如果长期上传的图片名字都是 1.jpg 的话,那么上传一张图,会造成数据库进行几十到上百次的 SQL 查询,应该在上传的时候把图片的名字更改了,给图片的名字加多一个时间戳,这样就能几乎保证图片名字不可能重复了:

详细介绍:如果经常在 WordPress 上传同名的图片,最好开启这个选项

之前还有一些优化增强功能,我因为各种原因去除或者移到别的插件。

  • 搜索结果快速跳转:提高搜索效率,当搜索结果只有一篇时直接重定向到文章该功能已经移到搜索优化插件。
  • 禁止admin用户名:使用admin作为用户名是最大的安全漏洞,建议禁止使用 admin 用户名尝试登录 WordPress,提高网站的安全性。很多人因为用户名是 admin,又开启这个功能,然后站点登录不了,然后说 WPJAM Basic 的问题,忍疼删除该功能,大家记得不要设置 admin 的用户名。
  • 前台不加载语言包:WordPress加载语言包是需要花费 0.1-0.5 秒不等的时间,如果对性能要求极致,可以前台不加载语言包,但是要把主题文件中的描述改成中文。很多人设置了该功能,前台出现英文,说WPJAM Basic 乱改,所以继续忍疼删除该功能。
  • 媒体文件默认链接到:无/媒体文件/附件页面,该功能已经迁移到图片集插件。

PHP 8 重大变更:is_callable() 不再支持类名+非静态方法检查,强制返回 false!

2025年4月18日 00:10

最近在 PHP 8 环境下,发现 #WPJAM Basic# 的一个严重问题:就是后台文章和分类列表的一些操作无效了,点击保存按钮没有任何反应。经过深入调试,发现问题根源在于 PHP 8 对is_callable()函数的行为进行了重大调整。

技术细节

在 PHP 8 之前,is_callable() 函数在检查类名与非静态方法的组合时会返回 true,即使这种调用方式在实际执行时可能会导致问题。PHP 8 对此进行了更严格的检查,以提前发现潜在的错误调用方式,因此 is_callable() 在检查一个类名与非静态方法时将返回失败(应当检查一个类的实例)。

具体看下面这个例子就大概能够明白了:

class Test{
    public function method1() { }
    public static function method2() { }
}

// PHP 8 之前
var_dump(is_callable(['Test', 'method1']));	// bool(true)
var_dump(is_callable(['Test', 'method2']));	// bool(true)

// PHP 8 之后
var_dump(is_callable(['Test', 'method1']));	// bool(false)
var_dump(is_callable(['Test', 'method2']));	// bool(true)
var_dump(is_callable([new Test, 'method1']));	// bool(true)

变更原因

PHP 8 的这一变更是为了更严格地执行面向对象编程规范:

  1. 静态与非静态方法调用的区分:非静态方法需要类的实例才能调用,而静态方法可以直接通过类名调用。
  2. 提前错误检测:在 PHP 7 及以下版本,虽然 is_callable() 会返回 true,但实际以静态方式调用非静态方法时会产生警告。PHP 8 通过 is_callable() 提前返回 false 来更早发现问题。
  3. 代码质量提升:强制开发者明确方法调用的上下文,避免模糊的调用方式。

解决方案

既然知道这个原因,那就是代码要根据上下文来写了。所以如果要检查某个对象的非静态方法是否可调用,应该使用一个对象实例而不是类名。

此外,其实很多时候我们只需要检查类的方法是否存在,而不关心其可调用性(例如访问控制),那么可以简单使用 method_exists() 进行判断就好了:

if (method_exists('Test', 'method1')) {
    // Do something
}

在 WordPress 后台集成了标签选择器(tag-input)和多选选择器(mu-select)

2025年3月28日 00:04

使用过 #WPJAM Basic# 的同学都知道,WPJAM Basic 集成了多个字段组件,这些组件都是后台定义一下,然后前段就能够渲染,并且提交的时候也会根据类型进行验证和处理,反正就是我通过前后端双修的模式将字段设置这块做到了最简洁了。😁

比如多个输入框(类型:mu-text),在「CDN 加速」里的「扩展名」字段:

甚至可以无限重复的一组字段(类型:mu-fields),在「缩略图设置」里面的:「未设置缩略图是,获取特色图片顺序」字段:

还有设置多个图片(类型:mu-img),还是在「缩略图设置」里面的「默认缩略图」字段:

这些字段都是后端配置的,自动渲染生成的,不用再多写一行前段 JS 代码:

「扩展名」字段:

[
	'exts'	=> [
		'type'		=> 'mu-text',
		'button_text'	=> '添加扩展名',
		'direction'	=> 'row',
		'sortable'	=> false,
		'description'	=> '镜像到云存储的静态文件扩展名'
	]
]

「获取顺序」字段:

[
	'post_thumbnail_orders'	=> [
		'title'		=> '文章缩略图',
		'type'		=> 'mu-fields',
		'group'		=> true,
		'max_items'	=> 5,
		'before'	=> '首先使用文章特色图片,如未设置,将按照下面的顺序获取:<br />',
		'fields'	=> [
			'type'	=> ['type'=>'select',	'options'=>[
				''			=> '请选择来源',
				'first'		=> '第一张图',
				'post_meta'	=> [
					'label'		=> '自定义字段',
					'fields'	=> ['post_meta'=>['type'=>'text',	'class'=>'all-options',	'placeholder'=>'请输入自定义字段的 meta_key']]
				],
				'term'		=>[
					'label'		=> '分类缩略图',
					'show_if'	=> ['term_thumbnail_type', 'IN', ['img','image']],
					'fields'	=> ['taxonomy'=>['options'=>[''=>'请选择分类模式']+$tax_options]]
				]
			]]
		]
	]
]

「默认缩略图」字段:

[
	'default'	=> [
		'title'		=> '默认缩略图',
		'type'		=> 'mu-img',
		'item_type'	=>'url'
	]
]

就是这样配置一下就好,剩下的程序会自动处理,厉害吧!这就是我前后端兼修的能力。😂

但是还是有些地方需要一些主键,比如在列表筛选的时候,用到上面这些多输入框的时候,界面就有点挤了,所以就有了「标签选择器」和「多选选择器」这两个字段组件。

「标签选择器」这个其实和上面的多输入框很类似,只是它每输入一个之后,就变成类似标签的样式:

支持自动完成,拖动排序,删除,按退格键(Backspace)不仅可以删除输入的文字,也可以删除前面的标签(为了防止误删,需要快速按两次)。这个可能更多的是样式的改进,但是更重要的是界面的节省。

使用也很简单,首先它的类型是:tag-inpug

[
	'tags'	=> [
		'type'			=> 'tag-input',
		'data_type'		=> 'taxonomy',	// 数据类型
		'taxonomy'		=> 'post_tag',	// 文章标签
		'min_items'		=> 2,	// 至少 2 个
		'max_items'		=> 3,	// 最多 3 个
		'unique_items'	=> true // 不能重复,已选择的项目不会再次出现
	]
]

有时候被选择的项目数量是有限的,比如分类,但是要多选,如果使用 select 的话,只能单选,当然 select 有个 multiple 属性,但是显示的效果是这样的:

通过按着 CTRL 或者 Shift 然后点击进行多选,怎么用,怎么难受,并且高度太高,不好排版,如果强制设置为一行,都不知道选择了什么。

所以我们做了「多选选择器」这个组件,它默认显示选中的选项,通过逗号分割开:

点击「下拉选择框」(其实这个是个按钮,通过 CSS 改造和下拉选择框很类似)就可以看到所有选项,并且所有选项前面都有个复选框:

勾选之后,就会显示到上面「下拉选择框」中,并且同样也支持设置至少和最多的数量,选好之后点击人地方,这个下拉复选框就隐藏了,这样就能大大节省界面:

使用也很简单,首先它的类型是:mu-select,其实把上面标签选择器的代码复制下来,改下类型就好了

[
	'tags'	=> [
		'type'			=> 'mu-select',
		'data_type'		=> 'taxonomy',	// 数据类型
		'taxonomy'		=> 'category',	// 文章分类
		'min_items'		=> 2,	// 至少 2 个
		'max_items'		=> 3,	// 最多 3 个
	]
]

如果你基于 WPJAM Basic 进行二次开发,那么这两个字段组件可以帮到你很多。为了写这两个字段,我相当于又重修了一下 JavaScript 这门语言,还好现在有 DeepSeek,很多模棱两可的东西,都可以问题,然后也可以让它给到一些演示代码,然后在改就简单了很多。😁

在 WordPress 中如何优雅的使用全局变量

2025年3月29日 22:15

程序写多了,都会认同这条规则:在 WordPress 中,都尽量不要使用全局变量,其实任何 PHP 程序中都是这样的。为什么?先从简单介绍下全局变量开始。

什么是全局变量

全局变量是在 PHP 脚本的任何作用域中都可以访问的变量,主要包括以下几种形式:

超全局变量 (Superglobals)

PHP 预定义的全局数组,​无需使用 global 声明即可在任何作用域访问:

  • $_GET:HTTP GET 请求参数
  • $_POST:HTTP POST 请求参数
  • $_REQUEST:GET/POST/COOKIE 的合并数据
  • $_SESSION:会话数据
  • $_COOKIE:客户端 Cookie 数据
  • $_SERVER:服务器和执行环境信息
  • $_FILES:上传文件信息
  • $_ENV:环境变量
  • $GLOBALS:所有全局变量的引用集合

使用 global 关键字

在函数或方法内部通过 global 关键字访问全局变量:

$globalVar = 10;

function test() {
    global $globalVar;
    echo $globalVar; // 输出 10
}

$GLOBALS 数组

直接通过 $GLOBALS 访问全局变量:

$globalVar = 10;

function test() {
    echo $GLOBALS['globalVar']; // 输出 10
}

使用全局变量的问题

代码可维护性差

  • 隐式依赖:函数内部依赖全局变量会导致代码逻辑不透明,难以追踪数据来源。
  • 耦合度高:修改全局变量可能影响多个地方,引发难以调试的副作用。

作用域污染

  • 命名冲突:全局变量可能与其他变量或库中的变量同名,导致意外覆盖。
  • 生命周期不可控:全局变量在脚本结束前一直存在,可能占用不必要的内存。

并发和线程安全问题

  • 在并发环境(如多线程或异步任务)中,全局变量可能被多个线程同时修改,导致数据不一致。

测试困难

  • 全局状态使得单元测试难以隔离,测试用例之间可能互相影响。

安全隐患

  • 超全局变量(如 $_GET$_POST)未过滤时可能引发安全漏洞(如 SQL 注入、XSS)。

全局变量虽然方便,但过度使用会导致代码质量下降。应该遵循“最小作用域原则”和“单一职责原则”,能显著提升代码的可维护性和安全性。

在 WordPress 中正确使用全局变量

但是我们在代码中还是要使用一些全局变量,或者类似全局变量的变量,比如我在小程序中记录当前登录的用户的 openid:$weapp_openid。那么怎么办呢?

先上代码:

function wpjam_var($name, ...$args){
	static $vars;

	$vars	??= wpjam_parse_user_agent();	// 当前用户访问的环境信息

	if($args && (!isset($vars[$name]) || !is_closure($args[0]))){
		$value	= maybe_closure($args[0], $name);

		if(is_wp_error($value) || is_null($value)){
			return $value;
		}

		$vars[$name]	= $value;
	}

	return $vars[$name] ?? null;
}

我创建一个 wpjam_var 函数,这个函数创建一个静态变量 $vars,它是一个数组,所有全局要使用的变量都存到该数组中。

$weixin_openid	= '通过小程序插件获取';

// 存储变量
wpjam_var('weapp_openid', $weixin_openid);

然后在之后 $weapp_openid 可以通过以下方法获取:

// 获取变量
wpjam_var('weapp_openid');

它还支持闭包函数,比如我们可以将获取 $weapp_openid 包装成一个函数:

function weapp_get_current_openid(){
	return wpjam_var('weapp_openid', function(){
		$access_token	= wpjam_get_parameter('access_token');

		if(!$access_token){
			return new WP_Error('illegal_access_token', 'Access Token 为空!');
		}

		return WEAPP::get_openid_by_access_token($access_token);
	});
}

这样在之后的地方都可以使用 weapp_get_current_openid 获取 $weapp_openid。它的具体如何获取和实现,

最后再总结一下 wpjam_var 函数,它的第一个参数 $name 很简单,变量的名称,第二个参数分三种情况:

  1. 如果没有设置,就返回该变量的值,没有设置则为 null
  2. 如果是简单的值(非闭包),则设置并返回该值。
  3. 如果是闭包函数,如设置 $name 的变量,则返回它的值,如果未设置,通过调用闭包函数获得值,然后设置并返回。

wpjam_var 函数的好处

1. 作用域隔离,避免污染

  • 数据封闭性
    示例中的 $weapp_openid 通过 wpjam_var 存储,​仅限函数内部访问,外部无法直接修改,彻底规避全局变量的命名冲突和意外覆盖。
  • 安全访问
    所有操作必须通过 wpjam_var 函数(如 weapp_get_current_openid()),​天然实现私有性,避免全局污染。敏感数据(如 access_token)的获取逻辑封装在闭包内,防止外部直接暴露。

2. 性能优化(延迟初始化)​

  • 按需加载
    示例中 $weapp_openid 的闭包函数可能涉及数据库查询,首次调用时执行一次并缓存结果,后续直接复用,避免重复计算。
  • 内存级访问速度
    静态变量存储在内存中,访问速度远超全局变量或文件读取。同一请求中多次调用 weapp_get_current_openid() 时,​性能提升显著​(如减少冗余 API 调用)。

3. 灵活的数据管理

  • 动态惰性计算
    通过闭包(如示例中的匿名函数)实现“按需生成数据”,仅在未缓存时触发逻辑,资源利用率更高。
  • 错误隔离与健壮性
    检测 WP_Error 或 null(如 access_token 为空时返回错误),​避免污染缓存,确保后续逻辑仅处理有效数据。

4. 可维护性与扩展性

  • 逻辑集中管理
    weapp_get_current_openid() 作为唯一入口,​集中维护 openid 的获取规则,修改生成逻辑(如更换认证方式)只需调整闭包,无需全局搜索。
  • 易于扩展功能
    支持快速添加类型检查、日志记录或缓存失效机制(如 reset 参数),​无需改动外部调用代码,扩展成本低。
  • 代码清晰度
    数据定义($weapp_openid)与业务逻辑(闭包)分离,​提升可读性,降低维护难度。

5. 安全性提升

  • 输入验证与过滤
    示例中闭包内对 access_token 做非空校验,​拦截非法输入​(如空值或无效格式),防止无效请求进入下游逻辑。
  • 风险隔离
    敏感操作(如 get_openid_by_access_token())封装在闭包中,​统一实施安全策略​(如加密、超时控制),避免全局变量直接暴露的风险。

6. 适用场景

  • 高频请求数据
    如示例中的 openid,适用于同一请求内多次访问的场景(如用户信息、权限校验)。
  • 动态配置管理
    根据环境加载不同配置(如开发/生产环境参数),通过闭包实现按需加载。
  • 共享资源访问
    替代单例模式,简化数据库连接池等共享资源的管理。

上面这段话,是 deepseek 帮我总结的,果然比我吹的好,但是也说明这个函数实现的好,哈哈!在最新版的 #WPJAM Basic# 即可直接使用。

preg_replace_callback 如果正则有问题,竟然不是返回原字符串,而是返回 null

2025年3月19日 00:00

#WPJAM Basic# 有个功能,就是在 WordPress 后台文章列表添加上文章特色图片,并且支持点击设置:

这个功能因为 WordPress 没有好的 Hook 使用,我是通过对最终生成的 HTML 实现正则替换实现的。

这个功能本来挺好的,然后有个用户说使用 WPJAM Basic 之后,说后台文章列表空白,经过我仔细的 Debug,原来他使用的标签太多了,使得 HTML 过于复杂,正则回溯次说过多,发生错误了。

原本我以为正则错就错了呗,最多就是正则替换不成功,功能没有,为啥还给我整成空白的呢?我仔细查了下 PHP 官方文档,原来 preg_replace_callback 函数的返回是这样的:

如果 subject 是一个数组, preg_replace_callback() 返回一个数组,其他情况返回字符串。错误发生时返回 null

厄,错误发生时返回 null,第一次知道,一下子无言以对,原来之前正则都是成功了,我都没有去处理错误的情况,真的是。

然后 preg_replace 也是一样的情况,错误发生时返回 null

所以我写了一个函数 wpjam_preg_replace,同时实现  preg_replace_callbackpreg_replace 的正则替换功能(它们的参数差不多,一个是回调,一个是替换的字符串),如果发生错误时,不是返回 null,而是返回原始 $subject

function wpjam_preg_replace($pattern, $replace, $subject, $limit=-1, &$count=null, $flags=0){
	if(is_closure($replace)){
		$result	= preg_replace_callback($pattern, $replace, $subject, $limit, $count, $flags);
	}else{
		$result	= preg_replace($pattern, $replace, $subject, $limit, $count);
	}

	if(is_null($result)){
		trigger_error(preg_last_error_msg());
		return $subject;
	}

	return $result;
}

如果发生了错误,并且在 log 中打印出具体的错误信息,方便查看原因,看看能不能优化正则什么的。这里有个限制,preg_replace_callback 的回调函数只能是闭包,因为同时要支持两个函数的原因,使用闭包比较容易判断。

有了这个函数之后,即使发生正则错误,至少还能显示页面,这也算是一种防御性编程(防御性编程是一种编程实践,旨在编写代码以抵御或处理潜在的错误和异常情况,以提高代码的健壮性和可靠性)。😆

在 DeepSeek 的帮助下,我又给 WPJAM Basic 增加了几个函数!

2025年2月26日 23:21

对于程序员来说,写代码其实不难,反而最难的是给函数命名,这是困扰程序员最大的问题,很多程序员开玩笑说:编程5分钟,命名2小时。😂

比如之前网上就有一张图,反应了程序员编程的时候,具体在干嘛:

让 DeepSeek 给函数命名

首先我们先明确一下:什么样的函数名是一个好的名字呢?

好的函数命名应当简洁、清晰且易于理解,能够在不查看具体实现的情况下直观地反映出其功能和用途。

但实际上找到这样的命名并不容易,需要充分考虑变量、函数和类的功能、用途以及上下文环境,因此程序员需要花费大量时间思考如何为代码中的各个元素命名,以提高代码的可读性和可维护性。

那么如果我们让 DeepSeek 在我们给函数命名的时候,给我我们一些建议,是不是可以解决我们这个困扰呢? 或者说打开我们的思路呢?我们说干就干,首先是提示词,经过调试,下面是我的函数命名的提示词是:

我将发给你一段程序代码,你根据这段代码帮我提炼出函数的名称,函数名称的风格为下划线风格,然后函数应用于 WordPress,需要参考 WordPress 函数命名风格,并简单解释下为什么这么命名,如果可以请提供多一些选项以供选择,谢谢。

正好最近在发布 #WPJAM Basic# 新版的时候,为了方便,又增加了几个函数,比如下面,判断变量是不是闭包函数:

return $object instanceof Closure;

再来一个,如果变量回调函数,那就调用回调函数,否则就还是返回变量本生:

return $value && is_callable($value) ? $value(...$args) : $value;

如果自己也有想法,可以再在和他沟通一下:😄

WPJAM Basic 新增函数

所最后在 DeepSeek 的帮助下,WPJAM Basic 新版增加下面几个函数:

1. maybe_callback

如果变量是回调函数,则调用回调函数,否则返回变量本身:

if(!function_exists('maybe_callback')){
	function maybe_callback($value, ...$args){
		return $value && is_callable($value) ? $value(...$args) : $value;
	}
}

2. maybe_closure

类似于 maybe_callback,但是它判断是闭包函数才调用,其他一样:

if(!function_exists('maybe_closure')){
	function maybe_closure($value, ...$args){
		return $value && is_closure($value) ? $value(...$args) : $value;
	}
}

3. is_closure

怎么判断闭包函数呢?就有这个函数了:

if(!function_exists('is_closure')){
	function is_closure($object){
		return $object instanceof Closure;
	}
}

4. wpjam_pick

从对象或者数组中,根据 $keys 获取一个关联数组,类似 JS 工具库 underscore 或者 loadsh 的 _.pick 函数,如果是从数组中获取,其实和 WordPress 内置的 wp_array_slice_assoc 一样,只是命名这个更加简洁。

function wpjam_pick($arr, $keys){
	return is_object($arr) ? wpjam_array($keys, fn($i, $k)=> isset($arr->$k) ? [$k, $arr->$k] : null) : wp_array_slice_assoc($arr, $keys);
}

等我发布新版,就可以使用了!

需要别人登录你的 WordPress,再也不需要给账号密码了,现在可以给「一次登录链接」了!

2025年2月16日 20:18

前面我们介绍「为什么你的 WordPress 站点老是被黑?」的时候,说到大胡子和我卖 Modular 主题,我们的售后是很负责的,😎 会在用户允许的情况下,进入后台帮忙解决,这时候我们需要对方提供一下后台的账号密码,然后就接触到了很多简单到令人发指的密码,所以网站就被黑了。

说到要求对方提供账号密码这个事情,有用户提出,其实给人账号密码也很不安全,最好是创建一个新的管理员账号,这样就不会不小心暴露自己常用密码。

一次登录链接

但是创建一个新的管理员账号也是麻烦,用完又要删除或者去修改密码。那么有没有更好的方法呢?今天想到一个好方法,就是给某个用户创建「一次登录链接」,只能使用一次,这样就不用担心「售后」的时间。✌️

我就把该功能增加到「用户管理」功能,默认是开启的:

然后在用户列表就会有「生成链接」的操作,我把原来的「生成重置密码链接」一起合并进来:

点击之后,链接类型选择「一次登录」,链接有效期默认是 3 个小时,意思是 3 个小时内该链接点击都可以登录,过了就不行。

然后复制该链接,发送给帮你解决问题的好人,就可以了。

WPJAM「用户管理」

这次一次登录链接功能,我集成到了 WPJAM 这个「用户管理」插件中,它是 WordPress 果酱知识星球福利插件,加入「WordPress果酱」知识星球(长按下图二维码)即可下载:

「用户管理」:一键实现用户名称优化,用户安全增强,自定义头像等多项功能 WordPress 插件

2025年1月4日 19:22

这是基于 WPJAM Basic 的超强的 WordPress 用户管理的插件,有多强大呢,首先看后台的设置界面:

可以说它把 WordPress 相关的用户管理功能都集成了,简单数一数就实现了十多个 WordPress 用户相关功能:

  1. 屏蔽个性化设置
  2. 屏蔽姓氏和名字设置
  3. 取消显示名称设置
  4. 开启别名设置
  5. 隐藏用户登录名
  6. 开启登录次数限制
  7. 用户最后登录时间
  8. 取消「应用程序密码」
  9. 按注册时间排序
  10. 以此身份登陆
  11. 生成密码重置链接
  12. 自定义用户头像
  13. 默认用户头像

下面我们分成五大模块分别来介绍 WPJAM 的「用户管理插件」具体实现了那些功能:

屏蔽个性化设置

WordPress后台个人资料用户可以设置「可视化编辑器」,「语法高亮」,「配色方案」,「键盘快捷键」,「工具栏」,「语言」等这些个性化选项,如下图:

这些选项 WordPress 都是存储到 usermeta 表里面,如果 WordPress 有大量的用户,每个用户会占用7个选项,那么 usermeta 表很快就会爆炸。

比如我运营的 WordPress 站点,有几十万用户,usermeta 表的数据如果不清理的话,已经千万级了,查点东西都慢的要死,如果你和我有一样的困扰,那就可以在插件中勾选实现屏蔽用户的个性化设置,直接采用使用系统全局的默认值。然后还可以根据自己的需求删除这些选项。

用户名称优化

在默认情况下,WordPress 后台个人资料页面中,关于用户的姓名相关的设置是这样的:

是不是有点繁琐,并且很多字段也是存到 usermeta 表中的,我个人觉得关于用户昵称的设置,尽量简洁就好,所以名字和姓氏一般就不需要用户输入,公开显示的名字直接为昵称就好了,所以插件首先提供了下面两个选项:

  • 屏蔽姓名设置:屏蔽了姓氏和名字设置,简化后台个人资料界面设置。
  • 显示名称设置:取消显示名称选择器,直接使用昵称作为显示名称。

另外插件还支持开启了别名设置,是的,我们不仅仅做减法,偶尔也做下加法,这里可以让用户可以编辑自己的别名(user_nicename),这样只要不使用和登录名相同的别名,作者文章链接就不会暴露用户名,当然没有设置别名,插件还是有安全选项来实现防止用户名暴露。

所以优化之后最终的用户界面非常简洁,如下所示:

安全增强

WordPres 用户安全增强体现在两个地方,首先是隐藏登录名,不要让攻击者猜到用户名,然后是开启登录限制,防止密码被暴力破解,插件也提供这两方面的选项:

首先说一下如何隐藏登录名,如果用户没有修改过别名(user_nicename),那么他的别名和登录名(user_login)是一样的,然后作者文章链接或者其他地方就会暴露登录名,为了进一步防止登录名暴露,我们提供了隐藏登录名的选项:

勾选「防止登录名暴露」之后,如果用户的 user_nicenameuser_login 是一样的情况下:

1. 作者文章链接使用 author_id 代替 user_nicename,并且原来的作者链接直接设置为 404 页面,防止用户名暴露

2. user_login 不出现在 body_classcomment_class 中。

3. 隐藏登录失败时候未知用户名和密码不正确的错误信息,这两种情况都显示「用户名或者密码错误」,让攻击者猜去。😁

4. 取消作者相关的 sitemap 以及 REST API 中可以查看所有发布过文章的用户信息列表的中的登录名。

如果真的被攻击者猜到了登录名,那么我们还可以开启登录限制,限制登录失败次数,这样就可以防止密码被暴力破解了,进一步做到安全。

功能增强

除了安全增强之外,我们还增加了一个小功能和屏蔽一个功能,分别是记录用户最后登录时间和取消「应用程序密码」功能:

首先新增记录用户最后登录时间,用户登录之后,在后台用户列表就会显示该用户的最后登录时间,并且支持按照用户最后登录时间进行排序。

默认情况下在后台个人资料页面可以设置「应用程序密码」:

应用程序密码允许通过非交互式系统(例如 XML-RPC 或 REST API)进行身份验证,而无需提供您的实际密码。应用密码可以随时撤销。它们不能用于通过传统方式登录您的网站。

很多人看到这个其实是稀里糊涂,简单说他就是用于 APP 或者小程序通过接口来登录的,但是基本上来说,我们用不到这个功能,所以默认建议屏蔽它。

后台用户列表

对于管理员经常使用的用户列表,也新增一些功能和操作:

首先用户可以除了可以按照上面提示按照最后登录事件排序之外,也可以按照用户注册时间排序,只要你勾选了用户列表里的第一个选项,此外在用户列表页面新增两个操作「以此身份登陆」和「生成密码重置链接」:

如果你是 WordPress 开发者,「以此身份登陆」这个功能特别实用,在用户列表界面,管理员可以轻松以用户的身份登录后台,这样用户说他碰到什么问题,就可以直接登录他的账号去看了,而不是问他要账号密码,这个多难为情啊。😳

WordPress 原来「发送密码重置邮件」这个功能是直接发送密码重置邮件给用户,用户在邮箱里面直接点击操作,改成「生成密码重置链接」,则管理员直接获取密码重置链接,可以通过微信或者其他的社交媒体工具发给用户。

头像设置

在后台个人资料页,用户可以自定义自己的头像。

如果用户没有设置头像,管理员可以设置默认头像,然后随机给用户使用:

最后用户头像还多加一个选项,就是如果用户已经在 Gravatar 里面设置了头像怎么办?有两个选项,从默认中随机选一个,继续使用 Gravatar 的设置。

总结

通过上面的介绍,是不是非常强大,目前我所有用户相关的功能整合到 WPJAM-User 的插件中,只需后台简单的勾选就可以实现绝大部分用户安全和管理相关的功能。


「WordPress果酱」知识星球福利插件基于 WPJAM Basic 开发,加入「WordPress果酱」知识星球,即可下载:

插件 简介
抓取公众号图文

支持一键同步微信公众号文章到 WordPress 博客,并支持一键将文章中所有图片都下载到 WordPress 媒体库。

搜索优化

WordPress 最强的搜索优化插件,支持限制每个 IP 每分钟搜索次数,达到上限之后屏蔽搜索时长,还可以限制搜索关键词的长度,搜索结果页面限制只显示「搜索结果」,还有以下搜索功能增强:

1. 只搜索文章标题,不搜索文章内容和摘要。
2. 当搜索关键词为空时重定向到首页,只有一篇文章时重定向到文章
3. 后台文章列表支持搜索ID。
4. 支持搜索自定义字段。

编辑器优化

一键增强 WordPress 经典 TinyMCE 编辑器:

1. 增加下划线,背景颜色,两端对齐,字体和大小设置,以及内容分页按钮。
2. 新增插入表格功能。
3. 直接插入屏幕截图。

标题设置

一键设置 WordPress 所有页面的页面标题,通过规则方式让博主可以自定义 WordPres 首页,分类,文章类型,文章详情都所有页面的页面标题。

登录优化

一键优化 WordPress 登录注册界面,并支持第三方账号登录和绑定,目前已经支持微信公众号(所有类型),微信小程序,手机号码第三方平台。

内容模板

实现在内容中插入一段共用的内容模板,通过短代码(shortcode)的方式来实现的,支持统一修改,目前支持普通的内容模板,表格内容模板和卡片内容模板三种类型。

用户管理

最强 WordPress 一键用户管理插件,一键实现以下12个功能:

1. 屏蔽个性化设置
2. 屏蔽姓氏和名字设置
3. 取消显示名称设置
4. 开启别名设置
5. 隐藏用户登录名
6. 开启登录次数限制
7. 用户最后登录时间
8. 按注册时间排序
9. 以此身份登陆
10. 生成密码重置链接
11. 自定义用户头像
12. 默认用户头像

分类管理

这是一个全能的 WordPress 分类管理插件:

1. 层式管理分类
2. 限制分类层级
3. 分类拖动排序
4. 使用数字固定链接
5. 首页文章支持分类过滤
6. 后台文章列表支持分类筛选过滤
7. 后台文章列表支持分类多重筛选

评论增强

这是一个 WordPress 评论增强插件,支持评论置顶,评论点赞和按照点赞数排序。

图片集

1. 给媒体创建个分类「图片集 | collection」
2. 图片分类限制为二级
3. 取消图片编辑入口
4. 附件页面直接图片链接。

配置器

全自动 WordPress 配置器,不用一行代码就可以开发。
支持自定义文章类型,自定义字段,自定义分类,分类选项,全局选项。

Script Loader

通过恢复 WordPress 联合加载方式来优化 WordPress 后台脚本加载。

外部链接

将文章或评论中的外部链接加上安全提示的中间页。
让用户确认之后再跳转,并还支持添加 nofollow rel 属性。

话题标签

文章中插入 #话题标签#。
如果是内部链接,直接跳转,
标签或者分类,则自动转换成标签或分类链接,
否则跳转到搜索链接。

格式文章

在 WordPress 实现真正的文章格式

草稿分享

一键生成草稿临时分享链接
并可设置分享链接的有效期

文章专题

设置文章专题,并在文章末尾显示一个文章专题列表。

文章隐藏

设置文章在列表⻚不显示,并且可以根据不同平台进行设置

Meta Data

可视化管理 WordPress Meta 数据,支持所有内置的 Meta 数据:
Post Meta,Term Meta,User Meta 和 Comment Meta。

站点选项

查看和管理所有非 WordPress 系统自动生成的站点选项。
如果你觉得某个选项无用,可以直接删除它。

后台论坛

WordPress 后台论坛,支持创建帖子,分组,消息。

微信小程序

微信小程序 WordPress 基础插件,包含基础类库和管理。

微信群二维码

轮询显示微信群二维码,突破微信群100人限制。

文章置顶

支持置顶文章排序和分类文章置顶的 WordPress 插件

静态文件

一键合并 WordPress 插件和主题的 JS 和 CSS 文件,加快页面加载速度

Debug

一键检测 WordPress 运行效率。

需要别人登录你的 WordPress,再也不需要给账号密码了,现在可以给「一次登录链接」了!

2025年2月10日 23:22

前面我们介绍「为什么你的 WordPress 站点老是被黑?」的时候,说到大胡子和我卖 Modular 主题,我们的售后是很负责的,😎 会在用户允许的情况下,进入后台帮忙解决,这时候我们需要对方提供一下后台的账号密码,然后就接触到了很多简单到令人发指的密码,所以网站就被黑了。

说到要求对方提供账号密码这个事情,有用户提出,其实给人账号密码也很不安全,最好是创建一个新的管理员账号,这样就不会不小心暴露自己常用密码。

一次登录链接

但是创建一个新的管理员账号也是麻烦,用完又要删除或者去修改密码。那么有没有更好的方法呢?今天想到一个好方法,就是给某个用户创建「一次登录链接」,只能使用一次,这样就不用担心「售后」的时间。✌️

我就把该功能增加到「用户管理」功能,默认是开启的:

然后在用户列表就会有「生成链接」的操作,我把原来的「生成重置密码链接」一起合并进来:

点击之后,链接类型选择「一次登录」,链接有效期默认是 3 个小时,意思是 3 个小时内该链接点击都可以登录,过了就不行。

然后复制该链接,发送给帮你解决问题的好人,就可以了。

WPJAM「用户管理」

这次一次登录链接功能,我集成到了 WPJAM 这个「用户管理」插件中,它是 WordPress 果酱知识星球福利插件,加入「WordPress果酱」知识星球(长按下图二维码)即可下载:

「用户管理」:一键实现用户名称优化,用户安全增强,自定义头像等多项功能 WordPress 插件

2025年1月4日 19:22

这是基于 WPJAM Basic 的超强的 WordPress 用户管理的插件,有多强大呢,首先看后台的设置界面:

可以说它把 WordPress 相关的用户管理功能都集成了,简单数一数就实现了十多个 WordPress 用户相关功能:

  1. 屏蔽个性化设置
  2. 屏蔽姓氏和名字设置
  3. 取消显示名称设置
  4. 开启别名设置
  5. 隐藏用户登录名
  6. 开启登录次数限制
  7. 用户最后登录时间
  8. 取消「应用程序密码」
  9. 按注册时间排序
  10. 以此身份登陆
  11. 生成密码重置链接
  12. 自定义用户头像
  13. 默认用户头像

下面我们分成五大模块分别来介绍 WPJAM 的「用户管理插件」具体实现了那些功能:

屏蔽个性化设置

WordPress后台个人资料用户可以设置「可视化编辑器」,「语法高亮」,「配色方案」,「键盘快捷键」,「工具栏」,「语言」等这些个性化选项,如下图:

这些选项 WordPress 都是存储到 usermeta 表里面,如果 WordPress 有大量的用户,每个用户会占用7个选项,那么 usermeta 表很快就会爆炸。

比如我运营的 WordPress 站点,有几十万用户,usermeta 表的数据如果不清理的话,已经千万级了,查点东西都慢的要死,如果你和我有一样的困扰,那就可以在插件中勾选实现屏蔽用户的个性化设置,直接采用使用系统全局的默认值。然后还可以根据自己的需求删除这些选项。

用户名称优化

在默认情况下,WordPress 后台个人资料页面中,关于用户的姓名相关的设置是这样的:

是不是有点繁琐,并且很多字段也是存到 usermeta 表中的,我个人觉得关于用户昵称的设置,尽量简洁就好,所以名字和姓氏一般就不需要用户输入,公开显示的名字直接为昵称就好了,所以插件首先提供了下面两个选项:

  • 屏蔽姓名设置:屏蔽了姓氏和名字设置,简化后台个人资料界面设置。
  • 显示名称设置:取消显示名称选择器,直接使用昵称作为显示名称。

另外插件还支持开启了别名设置,是的,我们不仅仅做减法,偶尔也做下加法,这里可以让用户可以编辑自己的别名(user_nicename),这样只要不使用和登录名相同的别名,作者文章链接就不会暴露用户名,当然没有设置别名,插件还是有安全选项来实现防止用户名暴露。

所以优化之后最终的用户界面非常简洁,如下所示:

安全增强

WordPres 用户安全增强体现在两个地方,首先是隐藏登录名,不要让攻击者猜到用户名,然后是开启登录限制,防止密码被暴力破解,插件也提供这两方面的选项:

首先说一下如何隐藏登录名,如果用户没有修改过别名(user_nicename),那么他的别名和登录名(user_login)是一样的,然后作者文章链接或者其他地方就会暴露登录名,为了进一步防止登录名暴露,我们提供了隐藏登录名的选项:

勾选「防止登录名暴露」之后,如果用户的 user_nicenameuser_login 是一样的情况下:

1. 作者文章链接使用 author_id 代替 user_nicename,并且原来的作者链接直接设置为 404 页面,防止用户名暴露

2. user_login 不出现在 body_classcomment_class 中。

3. 隐藏登录失败时候未知用户名和密码不正确的错误信息,这两种情况都显示「用户名或者密码错误」,让攻击者猜去。😁

4. 取消作者相关的 sitemap 以及 REST API 中可以查看所有发布过文章的用户信息列表的中的登录名。

如果真的被攻击者猜到了登录名,那么我们还可以开启登录限制,限制登录失败次数,这样就可以防止密码被暴力破解了,进一步做到安全。

功能增强

除了安全增强之外,我们还增加了一个小功能和屏蔽一个功能,分别是记录用户最后登录时间和取消「应用程序密码」功能:

首先新增记录用户最后登录时间,用户登录之后,在后台用户列表就会显示该用户的最后登录时间,并且支持按照用户最后登录时间进行排序。

默认情况下在后台个人资料页面可以设置「应用程序密码」:

应用程序密码允许通过非交互式系统(例如 XML-RPC 或 REST API)进行身份验证,而无需提供您的实际密码。应用密码可以随时撤销。它们不能用于通过传统方式登录您的网站。

很多人看到这个其实是稀里糊涂,简单说他就是用于 APP 或者小程序通过接口来登录的,但是基本上来说,我们用不到这个功能,所以默认建议屏蔽它。

后台用户列表

对于管理员经常使用的用户列表,也新增一些功能和操作:

首先用户可以除了可以按照上面提示按照最后登录事件排序之外,也可以按照用户注册时间排序,只要你勾选了用户列表里的第一个选项,此外在用户列表页面新增两个操作「以此身份登陆」和「生成密码重置链接」:

如果你是 WordPress 开发者,「以此身份登陆」这个功能特别实用,在用户列表界面,管理员可以轻松以用户的身份登录后台,这样用户说他碰到什么问题,就可以直接登录他的账号去看了,而不是问他要账号密码,这个多难为情啊。😳

WordPress 原来「发送密码重置邮件」这个功能是直接发送密码重置邮件给用户,用户在邮箱里面直接点击操作,改成「生成密码重置链接」,则管理员直接获取密码重置链接,可以通过微信或者其他的社交媒体工具发给用户。

头像设置

在后台个人资料页,用户可以自定义自己的头像。

如果用户没有设置头像,管理员可以设置默认头像,然后随机给用户使用:

最后用户头像还多加一个选项,就是如果用户已经在 Gravatar 里面设置了头像怎么办?有两个选项,从默认中随机选一个,继续使用 Gravatar 的设置。

总结

通过上面的介绍,是不是非常强大,目前我所有用户相关的功能整合到 WPJAM-User 的插件中,只需后台简单的勾选就可以实现绝大部分用户安全和管理相关的功能。


「WordPress果酱」知识星球福利插件基于 WPJAM Basic 开发,加入「WordPress果酱」知识星球,即可下载:

插件 简介
抓取公众号图文

支持一键同步微信公众号文章到 WordPress 博客,并支持一键将文章中所有图片都下载到 WordPress 媒体库。

搜索优化

WordPress 最强的搜索优化插件,支持限制每个 IP 每分钟搜索次数,达到上限之后屏蔽搜索时长,还可以限制搜索关键词的长度,搜索结果页面限制只显示「搜索结果」,还有以下搜索功能增强:

1. 只搜索文章标题,不搜索文章内容和摘要。
2. 当搜索关键词为空时重定向到首页,只有一篇文章时重定向到文章
3. 后台文章列表支持搜索ID。
4. 支持搜索自定义字段。

编辑器优化

一键增强 WordPress 经典 TinyMCE 编辑器:

1. 增加下划线,背景颜色,两端对齐,字体和大小设置,以及内容分页按钮。
2. 新增插入表格功能。
3. 直接插入屏幕截图。

标题设置

一键设置 WordPress 所有页面的页面标题,通过规则方式让博主可以自定义 WordPres 首页,分类,文章类型,文章详情都所有页面的页面标题。

登录优化

一键优化 WordPress 登录注册界面,并支持第三方账号登录和绑定,目前已经支持微信公众号(所有类型),微信小程序,手机号码第三方平台。

内容模板

实现在内容中插入一段共用的内容模板,通过短代码(shortcode)的方式来实现的,支持统一修改,目前支持普通的内容模板,表格内容模板和卡片内容模板三种类型。

用户管理

最强 WordPress 一键用户管理插件,一键实现以下12个功能:

1. 屏蔽个性化设置
2. 屏蔽姓氏和名字设置
3. 取消显示名称设置
4. 开启别名设置
5. 隐藏用户登录名
6. 开启登录次数限制
7. 用户最后登录时间
8. 按注册时间排序
9. 以此身份登陆
10. 生成密码重置链接
11. 自定义用户头像
12. 默认用户头像

分类管理

这是一个全能的 WordPress 分类管理插件:

1. 层式管理分类
2. 限制分类层级
3. 分类拖动排序
4. 使用数字固定链接
5. 首页文章支持分类过滤
6. 后台文章列表支持分类筛选过滤
7. 后台文章列表支持分类多重筛选

评论增强

这是一个 WordPress 评论增强插件,支持评论置顶,评论点赞和按照点赞数排序。

图片集

1. 给媒体创建个分类「图片集 | collection」
2. 图片分类限制为二级
3. 取消图片编辑入口
4. 附件页面直接图片链接。

配置器

全自动 WordPress 配置器,不用一行代码就可以开发。
支持自定义文章类型,自定义字段,自定义分类,分类选项,全局选项。

Script Loader

通过恢复 WordPress 联合加载方式来优化 WordPress 后台脚本加载。

外部链接

将文章或评论中的外部链接加上安全提示的中间页。
让用户确认之后再跳转,并还支持添加 nofollow rel 属性。

话题标签

文章中插入 #话题标签#。
如果是内部链接,直接跳转,
标签或者分类,则自动转换成标签或分类链接,
否则跳转到搜索链接。

格式文章

在 WordPress 实现真正的文章格式

草稿分享

一键生成草稿临时分享链接
并可设置分享链接的有效期

文章专题

设置文章专题,并在文章末尾显示一个文章专题列表。

文章隐藏

设置文章在列表⻚不显示,并且可以根据不同平台进行设置

Meta Data

可视化管理 WordPress Meta 数据,支持所有内置的 Meta 数据:
Post Meta,Term Meta,User Meta 和 Comment Meta。

站点选项

查看和管理所有非 WordPress 系统自动生成的站点选项。
如果你觉得某个选项无用,可以直接删除它。

后台论坛

WordPress 后台论坛,支持创建帖子,分组,消息。

微信小程序

微信小程序 WordPress 基础插件,包含基础类库和管理。

微信群二维码

轮询显示微信群二维码,突破微信群100人限制。

文章置顶

支持置顶文章排序和分类文章置顶的 WordPress 插件

静态文件

一键合并 WordPress 插件和主题的 JS 和 CSS 文件,加快页面加载速度

Debug

一键检测 WordPress 运行效率。

「搜索优化」:防止搜索攻击,限制搜索频率,增强搜索能力,WordPress 一键式搜索优化增强插件

2024年12月13日 23:49

在 WordPress 进行搜索是一个常见的操作,而 WordPress 搜索的底层其实就是使用 MySQL like 语法去检索文章的标题摘要内容查出相关的文章。

一般情况 WordPress 这样搜索没有什么大的问题,可能中文分词会存在一些语义理解的小问题,但是通过多次修改关键字多搜索几次总能找到想要的文章。

WordPress 搜索存在的问题

如果碰到攻击,WordPress 的搜索就有很大的问题,因为 WordPress 搜索的链接是 https://blog.wpjam.com/?s=关键词,攻击者只要使用脚本不停的切换关键字,就会造成系统不停去数据库搜索查询,缓存都救不了!

而这样 MySQL Like 查询相对来说是比较耗时的,这就存在被攻击的漏洞,并且攻击时使用的关键字都是随机的,生成的缓存键都是不同,这时候缓存都救不了。

另外 WordPress 只是简单使用 MySQL like 语法去检索文章的标题,摘要和内容来查出相关的文章,没有别的选项,能不能只搜索标题?能不能搜索ID,甚至搜索自定义字段等。

WordPress 最强的搜索优化插件

WPJAM 的「搜索优化」插件就能为了这些功能而实现的,在碰到搜索攻击的时候,可以去限制甚至关闭 WordPress 的搜索,然后一方面,它还提供很多的选项增强 WordPress 的搜索功能。

「搜索优化」插件安装之后,在「WPJAM」菜单的「文章设置」子菜单下就有「搜索优化」标签页,点击进入即可设置搜索优化的功能:

搜索范围

首先该插件可以设置搜索范围:

可以设置文章类型支持在那些文章类型中搜索,如果不设置,WordPress 会使用默认的方式。

其次可以设置哪些用户可以进行搜索,这里有三个选项,默认「所有用户都可以搜索」,然后也可以设置「仅限登录用户搜索」,甚至还可以「关闭站点搜索功能」,这个功能在站点受到攻击的时候,可能会帮到你。

搜索限制

第二大的功能是对搜索功能进行限制:

做站点最重要的就是安全,如上图所示,首先支持限制每个 IP 每分钟搜索多少次,达到上限之后屏蔽多少分钟。在遭受搜索攻击的时候,甚至可以直接关闭搜索,最后还可以设置管理员搜索功能不受影响。

下图就是用户搜索达到上限之后,用户再次搜索之后页面显示的效果:

微信公众号的搜索也可以搜索限制,只要使用#微信机器人#的自定义回复,插件就会自动检测每个公众号用户的搜索次数:

#果酱小程序#也支持搜索限制,达到搜索上限之后,同样会报错:

嗯,「WPJAM」出品的插件很多功能有关联,但也不影响单独使用,非常方便。

此外还可以设置「搜索关键词最大长度」,太长的关键字其实搜索不出什么东西,并且还增加系统的搜索负担,所以可以选择直接屏蔽了事。这个长度的规则还是:一个汉字算两个,一个英文单词算两个,空格不算,所以大家设置的时候注意下,别搞错了。

此外为了防止不怀好意的人来瞎搞,还可以设置「不允许搜索禁用词」。禁用词是在「设置」-「讨论」-「禁止使用的评论关键字」中设置的。

当然了,最后不要限制都把自己给限制了,所以最后还有个选项,可以开启:「站点管理员搜索功能不受上面这些条件限制」。

搜索增强

我们在给一些客户做定制开发的时候,也会经常碰到一些搜索的优化,比如能不能只针对文章标题进行搜索,能不能搜索自定义字段等等,这些功能「搜索优化」插件都实现了:

首先是重定向功能,开始的时候,就会:当关键词为空时重定向到首页,只有一篇文章时重定向到文章。这个功能原本是集成在 #WPJAM Basic# 中,我写了「搜索优化」插件之后,就整和到一起了,做强做大 WPJAM「搜索优化」插件。😁

接着是我命名为「标签搜索功能」,当关键词和分类/标签/自定义分类相同时,直接展示对应的文章。

搜索结果页面标题不显示关键字,只显示「搜索结果」四个字」,这个功能大家第一眼看可能感觉没啥,其实这个功能非常重要的,这里要特别讲解一下,为什么要做这个呢?

这是因为一些 WordPress 的站点的搜索结果页面被黑产会刷了,他们把自己的网站名字和域名刷到搜索结果的页面标题上:

图片

当然上面限制了搜索关键字长度之后,在一定程度上也限制了刷搜索结果的可能性,但是要继续杜绝这种事情,通过把搜索结果页面的标题只显示「搜索结果」则可以完全的防止住,因为无论搜索搜什么,都是显示「搜索结果」这四个字:

图片


只搜索文章标题,不搜索文章内容和摘要」:字面意思,懂的吧?😂

后台文章列表支持ID搜索,如123,多个ID用「,」分隔开,如12,34,56,这个在后台要定位某篇文章 ID 的时候特别有用。

支持搜索自定义字段,功能要别注意一下,开启之后搜索效率会明显下降,然后这个功能勾选之后,还可以选择是在所有自定义字段中搜索还是在指定的自定义字段(输入 meta_key )中搜索。

WPJAM「搜索优化」

WPJAM 这个「搜索优化」是不是很强大,关于 WordPress 搜索相关的功能,我都会整合到这个插件中。

它是 WordPress 果酱知识星球福利插件,加入「WordPress果酱」知识星球(长按下图二维码)即可下载:


「WordPress果酱」知识星球福利插件基于 WPJAM Basic 开发,加入「WordPress果酱」知识星球,即可下载:

插件 简介
抓取公众号图文

支持一键同步微信公众号文章到 WordPress 博客,并支持一键将文章中所有图片都下载到 WordPress 媒体库。

搜索优化

WordPress 最强的搜索优化插件,支持限制每个 IP 每分钟搜索次数,达到上限之后屏蔽搜索时长,还可以限制搜索关键词的长度,搜索结果页面限制只显示「搜索结果」,还有以下搜索功能增强:

1. 只搜索文章标题,不搜索文章内容和摘要。
2. 当搜索关键词为空时重定向到首页,只有一篇文章时重定向到文章
3. 后台文章列表支持搜索ID。
4. 支持搜索自定义字段。

编辑器优化

一键增强 WordPress 经典 TinyMCE 编辑器:

1. 增加下划线,背景颜色,两端对齐,字体和大小设置,以及内容分页按钮。
2. 新增插入表格功能。
3. 直接插入屏幕截图。

标题设置

一键设置 WordPress 所有页面的页面标题,通过规则方式让博主可以自定义 WordPres 首页,分类,文章类型,文章详情都所有页面的页面标题。

登录优化

一键优化 WordPress 登录注册界面,并支持第三方账号登录和绑定,目前已经支持微信公众号(所有类型),微信小程序,手机号码第三方平台。

内容模板

实现在内容中插入一段共用的内容模板,通过短代码(shortcode)的方式来实现的,支持统一修改,目前支持普通的内容模板,表格内容模板和卡片内容模板三种类型。

用户管理

最强 WordPress 一键用户管理插件,一键实现以下12个功能:

1. 屏蔽个性化设置
2. 屏蔽姓氏和名字设置
3. 取消显示名称设置
4. 开启别名设置
5. 隐藏用户登录名
6. 开启登录次数限制
7. 用户最后登录时间
8. 按注册时间排序
9. 以此身份登陆
10. 生成密码重置链接
11. 自定义用户头像
12. 默认用户头像

分类管理

这是一个全能的 WordPress 分类管理插件:

1. 层式管理分类
2. 限制分类层级
3. 分类拖动排序
4. 使用数字固定链接
5. 首页文章支持分类过滤
6. 后台文章列表支持分类筛选过滤
7. 后台文章列表支持分类多重筛选

评论增强

这是一个 WordPress 评论增强插件,支持评论置顶,评论点赞和按照点赞数排序。

图片集

1. 给媒体创建个分类「图片集 | collection」
2. 图片分类限制为二级
3. 取消图片编辑入口
4. 附件页面直接图片链接。

配置器

全自动 WordPress 配置器,不用一行代码就可以开发。
支持自定义文章类型,自定义字段,自定义分类,分类选项,全局选项。

Script Loader

通过恢复 WordPress 联合加载方式来优化 WordPress 后台脚本加载。

外部链接

将文章或评论中的外部链接加上安全提示的中间页。
让用户确认之后再跳转,并还支持添加 nofollow rel 属性。

话题标签

文章中插入 #话题标签#。
如果是内部链接,直接跳转,
标签或者分类,则自动转换成标签或分类链接,
否则跳转到搜索链接。

格式文章

在 WordPress 实现真正的文章格式

草稿分享

一键生成草稿临时分享链接
并可设置分享链接的有效期

文章专题

设置文章专题,并在文章末尾显示一个文章专题列表。

文章隐藏

设置文章在列表⻚不显示,并且可以根据不同平台进行设置

Meta Data

可视化管理 WordPress Meta 数据,支持所有内置的 Meta 数据:
Post Meta,Term Meta,User Meta 和 Comment Meta。

站点选项

查看和管理所有非 WordPress 系统自动生成的站点选项。
如果你觉得某个选项无用,可以直接删除它。

后台论坛

WordPress 后台论坛,支持创建帖子,分组,消息。

微信小程序

微信小程序 WordPress 基础插件,包含基础类库和管理。

微信群二维码

轮询显示微信群二维码,突破微信群100人限制。

文章置顶

支持置顶文章排序和分类文章置顶的 WordPress 插件

静态文件

一键合并 WordPress 插件和主题的 JS 和 CSS 文件,加快页面加载速度

Debug

一键检测 WordPress 运行效率。

还没升级到 PHP 8.4,也可以提前在 WordPress 中使用 PHP 8.4 引入的数组函数

2024年12月2日 23:17

PHP 升级到了 8.4,个人觉得对我们写代码帮助最大的就是 PHP 8.4 引入的 array_find()array_find_key()array_any() 和 array_all() 这 4 个 array_*() 数组函数。

其实这四个函数在 JavaScript 的 Array 的实例方法中就有了,只是他的命名方式和 PHP 有点不一样,就他是用 every 和 some 而不是 all 和 any,我之前写代码的时候,也有一些地方需要使用到这四个数组函数,所以我基于 JavaScript 的方式在 #WPJAM Basic# 中集成了这四个方法。

在 PHP 8.4 发布之后我基于 PHP 8.4 命名方式做了一些优化,使得大家在没有升级到 PHP 8.4,也可以提前在 WordPress 中使用 PHP 8.4 引入的数组函数。

array_find()

array_find() 是返回数组中第一个满足回调函数的元素,如果没有则返回 null,根据这个特性,我们很容易就是先这个函数:

if(!function_exists('array_find')){
	function array_find($arr, $callback){
		foreach($arr as $k => $v){
			if($callback($v, $k)){
				return $v;
			}
		}
	}
}

比如我在字段处理中,如果字段没有定义类型,我根据它是否有其他属性来给他设置类型的代码,如果没有 array_find,我们一般这么写:

if(!empty($field['options'])){
	$field['type']	= 'select';
}elseif(!empty($field['label'])){
	$field['type']	= 'checkbox';
}elseif(!empty($field['fields'])){
	$field['type']	= 'fieldset';
}else{
	$field['type']	= 'text';
}

有了 array_find,一行搞定了:

$field['type']	= array_find(['options'=>'select', 'label'=>'checkbox', 'fields'=>'fieldset'], fn($v, $k)=> !empty($field[$k])) ?: 'text';

array_find_key()

array_find_key()array_find() 很像,只是它返回数组中第一个满足回调函数的元素的健名:

if(!function_exists('array_find_key')){
	function array_find_key($arr, $callback){
		foreach($arr as $k => $v){
			if($callback($v, $k)){
				return $k;
			}
		}
	}
}

相比 array_find() 函数的定义,唯一的区别,它 return 的是 key 而不是 value。

上面的获取字段的类型的代码,也可以使用 array_find_key() 来实现,大家看看区别:

$field['type']	= array_find_key(['select'=>'options', 'checkbox'=>'label', 'fieldset'=>'fields'], fn($v, $k)=> !empty($field[$v])) ?: 'text';

array_all()

array_all() 判断数组中的每个元素是否都满足回调函数,意思是将每个元素传递给回调函数,都要返回 true

if(!function_exists('array_all')){
	function array_all($arr, $callback){
		foreach($arr as $k => $v){
			if(!$callback($v, $k)){
				return false;
			}
		}

		return true;
	}
}

比如我写的 SMTP 发信扩展里面就有判断代码,需要「发信地址」,「邮箱账号」和「邮箱密码」这三个选项都设置了之后才生效:

if(array_all(['host', 'user', 'pass'], fn($k)=> WPJAM_SMTP::get_setting($k))){
	// 执行代码
}

array_any()

array_any() 也是判断数组的元素是否满足满足回调函数,但是 array_any() 只需要一个满足即可,而 array_all() 一样则是需要全部都满足:

if(!function_exists('array_any')){
	function array_any($arr, $callback){
		foreach($arr as $k => $v){
			if($callback($v, $k)){
				return true;
			}
		}

		return false;
	}
}

上面例子中,发信设置扩展需要「发信地址」,「邮箱账号」和「邮箱密码」这三个选项都要设置,换成 array_any() 的思维,则只要一个没有设置就返回:

if(array_any(['host', 'user', 'pass'], fn($k)=> !WPJAM_SMTP::get_setting($k))){
	return;	// 返回,不生效
}

大家对比一下两个例子的代码,使用相类似的例子,通过不同的写法,也是一种更加清晰的区分函数的方式。😄

标题说了,还没升级到 PHP 8.4,也可以提前在 WordPress 中使用 PHP 8.4 引入的数组函数,意思只要你更新 WPJAM Basic 到最新版就能使用了,所以记得更新,有什么问题,记得给我留言。

在 WordPress 中如何设置背景色透明度?

2024年10月29日 23:55

最近开始写一些 WordPress 专业的知识,阅读数奇低,然后我发一些微信昵称技巧,又说我天天发这些小学生爱玩的玩意,写点文章真不容易。

那我两天发点专业的东西,两天发点小学生的东西,剩下三天我看着办,这样总行吧?

哈哈,那就天就发布一点点专业的东西,就是我们做网页开发的时候的时候如何设置透明背景。

为什么背景要设置透明度?

首先说下为什么背景要设置透明度,比如最近我给公司实现做的表格应用的时候,有个单元格条件样式的功能:

就是类似于 Excel 的条件格式化的功能,让数据根据不同的值显示不同的样式,如上图所示,可以设置,加粗,文本颜色,和填充颜色,其中填充就是设置单元格的背景颜色 :

由于我们的表格每一行本身就有间隔背景色(或者说斑马色),如果我们设置的单元格背景没有透明度的话,就会看不到间隔色,看数据不太方便,另外也会比较显眼,抢过了主体文本的颜色

也有人可能喜欢这种比较强烈的配色方式,不过不管了,我觉这个例子就是想给大家说下,我做了一个表格应用,可以自定义单元格样式,嘻嘻,另外也是为了点下今天的主体,怎么设置背景透明度。

如何设置背景透明度?

首先这个是 CSS 的活,我们都知道设置背景色的 CSS 代码:

// 使用 RGB
.background {
  background-color: rgb(255, 0, 0); /* 红色背景 */
}

// 使用 HSL
.background {
  background-color: hsl(120, 100%, 50%); /* 绿色背景 */
}

// 使用 HEX 6位16进制颜色代码
.background {
  background-color: #0000FF; /* 蓝色色背景 */
}

// 使用 HEX 3位16进制颜色代码
.background {
  background-color: #00F; /* 蓝色色背景 */
}

上面展示了 RGB 和 HSL 以及 HEX 16 进制三种设置背景的方法,但是这样设置都是不透明的。

那么如何设置透明度呢?其实也非常简单,只要给上面的颜色加上透明度的 Alpha 通道即可:

// 使用 RGBA
.background {
  background-color: rgba(255, 0, 0, 0.5); /* 红色背景 50% 透明度*/
}

// 使用 HSLA
.background {
  background-color: hsla(120, 100%, 50%, 0.3); /* 绿色背景  50% 透明度*/
}

// 使用 HEX 8位16进制颜色代码
.background {
  background-color: #0000FF80; /* 蓝色色背景 50% 透明度*/
}

// 使用 HEX 4位16进制颜色代码
.background {
  background-color: #00F8; /* 蓝色色背景 50% 透明度*/
}

其中 RGB 和 HSL 两种方法则在起方法名后面加上 A 即可,然后取值范围从 0(完全透明)到 1(完全不透明)。

16 进制的方法则有点复杂,使用16进制颜色代码设置背景透明度可以通过使用8位(#RRGGBBAA)或4位(#RGBA)的16进制格式来实现,其中最后两位(AA)或最后一位(A)代表透明度(Alpha)。透明度的值范围从00(完全透明)到FF(完全不透明)。

所以上面的例子中 0000FF 是蓝色,80(即128/255)表示大约50%的透明度。另外需要特别注意一下虽然现代浏览器普遍都支持16进制颜色透明度代码,但在某些旧版本的浏览器中可能不会正常工作,因此,如果你需要兼容,建议还是使用 rgba()hsla() 函数。

另外使用 opacity 定义透明度,但是他是使得整个元素透明度都下降,包括它的背景、文本和边框等,这个时候要注意你是要整体还仅仅是背景了。

.background {
  background-color: #0000FF; /* 蓝色色背景 */
  opacity: 0.5; /* 整个元素50% 透明度 */
}

在 WordPress 中如何设置支持透明度的颜色字段

我们知道有个 wp-color-picker 组件,可以让我们在设置输入字段的时候,可以直接选择颜色(在 WPJAM Basic 添加字段的时候,将 type 设置为 color 即可):

但是他无法设置透明度,Sergio 就更新了一下 wp-color-picker 组件,发不了 wp-color-picker-alpha 组件,支持通过拖拉即可设置透明度,如下图所示:

哈哈,WPJAM Basic 最新版也支持了该功能,在设置添加字段的时候,将 type 设置为 color 之外,还需要加上 data-alpha-enabled 属性,并将其设置为 true,比如我上面设置背景色的代码:

$fields	= [
	'background-color'	=> ['type'=>'color',	'button_text'=>'填充颜色',	'data-alpha-enabled'=>true]
];

我和大胡子做的模块化主题「Modular」也很快会加上该功能:

WordPress「站点选项」插件:一键查看和管理站点全局选项

2024年10月27日 23:42

前面我写了 WordPress 中如何设置全局选项?一文详解 WordPress 的 Option 功能,为了方便 WordPress 所有站点选项的管理和设置,我做了一个 WordPress「站点选项」插件,可以查看和管理所有 WordPress 站点的全局选项,特别是选项不再使用了,可以通过该插件直接删除它。

为什么开发这个插件?

我们知道绝大部分的插件和主题都会有选项设置,这些选项设置就会在 WordPress Option 表里面插入一些数据,如果这些插件或者主题不用的话,这些加入到 Option 表里面的数据一般都还会留在那里。

其实这些站点选项数据留在那里,问题也不大,不过总有一些有洁癖的同学,想清理一下,比如我,所以就开发了这个「站点选项」WordPress 插件。

查看和管理站点选项

安装好之后,在 WPJAM 菜单下会多出一个「站点选项」的子菜单,点击进去,即可查看站点上所有的全局选项:

对于这些选项数据,如果觉得没有任何用了,比如是插件停用之后的残留,就可以删除他们,不过删除前还是要再次确保不再使用。

除了删除之外,我们还可以进行「编辑」和「重命名」等操作,但是进行这些操作之前,还是要确认该操作不会造成任何问题。

另外对于如果数值是数组的选项,在列表是解析出来显示的:

但是在编辑的时候,在编辑的时候,显示的是序列化的:

所以编辑的时候,也要注意,不要搞错了,这时候建议的通过「替换」进行操作:

最后WordPress 选项「Option」的自动加载的功能,该功能是在 WordPress 的加载的时候,开启的「自动加载的选项就会一次全部加载,这样下次再使用该选项的时候,就无需再从数据库中获取。

所以该插件也可以加上一个设置「自动加载」的功能,可以开启或者关闭某个选项的「自动加载」功能,如下图所示,在列表页最后一列自动加载的开关点击一下即可切换:

总之,WordPress 「站点选项」是一个非常方便的后台数据管理 WordPress 插件,可以让你一键查看和管理站点的全局选项,但是操作之前还是要确保你对这些的操作已经足够了解,是自己真正需要的。😄

WordPress 「站点选项」插件

WordPress 「站点选项」插件是 WordPress 果酱知识星球福利插件,加入「WordPress果酱」知识星球(长按下图二维码)即可下载:


「WordPress果酱」知识星球福利插件基于 WPJAM Basic 开发,加入「WordPress果酱」知识星球,即可下载:

插件 简介
抓取公众号图文

支持一键同步微信公众号文章到 WordPress 博客,并支持一键将文章中所有图片都下载到 WordPress 媒体库。

搜索优化

WordPress 最强的搜索优化插件,支持限制每个 IP 每分钟搜索次数,达到上限之后屏蔽搜索时长,还可以限制搜索关键词的长度,搜索结果页面限制只显示「搜索结果」,还有以下搜索功能增强:

1. 只搜索文章标题,不搜索文章内容和摘要。
2. 当搜索关键词为空时重定向到首页,只有一篇文章时重定向到文章
3. 后台文章列表支持搜索ID。
4. 支持搜索自定义字段。

编辑器优化

一键增强 WordPress 经典 TinyMCE 编辑器:

1. 增加下划线,背景颜色,两端对齐,字体和大小设置,以及内容分页按钮。
2. 新增插入表格功能。
3. 直接插入屏幕截图。

标题设置

一键设置 WordPress 所有页面的页面标题,通过规则方式让博主可以自定义 WordPres 首页,分类,文章类型,文章详情都所有页面的页面标题。

登录优化

一键优化 WordPress 登录注册界面,并支持第三方账号登录和绑定,目前已经支持微信公众号(所有类型),微信小程序,手机号码第三方平台。

内容模板

实现在内容中插入一段共用的内容模板,通过短代码(shortcode)的方式来实现的,支持统一修改,目前支持普通的内容模板,表格内容模板和卡片内容模板三种类型。

用户管理

最强 WordPress 一键用户管理插件,一键实现以下12个功能:

1. 屏蔽个性化设置
2. 屏蔽姓氏和名字设置
3. 取消显示名称设置
4. 开启别名设置
5. 隐藏用户登录名
6. 开启登录次数限制
7. 用户最后登录时间
8. 按注册时间排序
9. 以此身份登陆
10. 生成密码重置链接
11. 自定义用户头像
12. 默认用户头像

分类管理

这是一个全能的 WordPress 分类管理插件:

1. 层式管理分类
2. 限制分类层级
3. 分类拖动排序
4. 使用数字固定链接
5. 首页文章支持分类过滤
6. 后台文章列表支持分类筛选过滤
7. 后台文章列表支持分类多重筛选

评论增强

这是一个 WordPress 评论增强插件,支持评论置顶,评论点赞和按照点赞数排序。

图片集

1. 给媒体创建个分类「图片集 | collection」
2. 图片分类限制为二级
3. 取消图片编辑入口
4. 附件页面直接图片链接。

配置器

全自动 WordPress 配置器,不用一行代码就可以开发。
支持自定义文章类型,自定义字段,自定义分类,分类选项,全局选项。

Script Loader

通过恢复 WordPress 联合加载方式来优化 WordPress 后台脚本加载。

外部链接

将文章或评论中的外部链接加上安全提示的中间页。
让用户确认之后再跳转,并还支持添加 nofollow rel 属性。

话题标签

文章中插入 #话题标签#。
如果是内部链接,直接跳转,
标签或者分类,则自动转换成标签或分类链接,
否则跳转到搜索链接。

格式文章

在 WordPress 实现真正的文章格式

草稿分享

一键生成草稿临时分享链接
并可设置分享链接的有效期

文章专题

设置文章专题,并在文章末尾显示一个文章专题列表。

文章隐藏

设置文章在列表⻚不显示,并且可以根据不同平台进行设置

Meta Data

可视化管理 WordPress Meta 数据,支持所有内置的 Meta 数据:
Post Meta,Term Meta,User Meta 和 Comment Meta。

站点选项

查看和管理所有非 WordPress 系统自动生成的站点选项。
如果你觉得某个选项无用,可以直接删除它。

后台论坛

WordPress 后台论坛,支持创建帖子,分组,消息。

微信小程序

微信小程序 WordPress 基础插件,包含基础类库和管理。

微信群二维码

轮询显示微信群二维码,突破微信群100人限制。

文章置顶

支持置顶文章排序和分类文章置顶的 WordPress 插件

静态文件

一键合并 WordPress 插件和主题的 JS 和 CSS 文件,加快页面加载速度

Debug

一键检测 WordPress 运行效率。

在 PHP 和 WordPress 中如何给数组切片

2024年9月12日 16:58

从一个数组中取出一段数据,或者说切片,这是非常常见的数组操作,PHP 已经内置了了 array_slice 函数来实现这个操作,但是面对关联数组的一些基于 key 的切片操作,该函数就有点力不从心了,那么我们面对这些复杂的情况,怎么操作呢?今天就通过这篇文章详细讲解一下在 WordPress 中如何给数组切片。

还是从 array_slice 说起

array_slice 的简介就是从数组中取出一段,它是从指定偏移量开始提取特定数量的元素,具体的语法:

array_slice(array $array, int $offset, int $length, bool $preserve_keys = false)
  • $array:待切片的数组。
  • $offset:切片开始的位置,从 0 开始计数,支持负数,从末端开始算起。
  • $length:切片元素的长度。
  • $preserve_keys(可选):是否保留切片元素的键名,默认值为 false。注意无论本参数如何设置,都会保留字符串的键。

还是看具体的例子吧。

// 从数组中取出第一个元素
$slice = array_slice([1, 2, 3, 4, 5], 0, 1); // [1]

// 从数组中取出第二个和第三个元素
$slice = array_slice([1, 2, 3, 4, 5], 1, 2); // [2, 3]

如果是用负偏移量,将从数组末尾开始计数:

// 从数组中取出倒数第二个元素
$slice = array_slice([1, 2, 3, 4, 5], -2, 1); // [4]

如果不指定长度,则切片将包括从偏移量到数组末尾的所有元素:

// 从数组中取出第二个和之后所有的元素
$slice = array_slice([1, 2, 3, 4, 5], 1); // [2, 3, 4, 5]

如果将 $preserve_keys 参数设置为 true,则切片元素将保留其原始键名:

// 从数组中取出第二个元素,并保留键名
$slice = array_slice([1, 2, 3, 4, 5], 1, 1, true); // [1 => 2]

对于关联数组,则  $preserve_keys 不管参数是什么值,都会保留原始的键:

// 从关联数组中取出第二和第三个个元素,下面都是输出 ['b'=>2, 'c'=>3]
$slice = array_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], 1, 2, true);

$slice = array_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], 1, 2);

关联数组如何切片

从上面的例子可以看出 array_slice  是基于偏移量和长度进行切片的,但是对于关联数组来说,如果我们要基于数组的 key 进行切片怎么操作?

WordPress 的 wp_array_slice_assoc

WordPress 内置有个 wp_array_slice_assoc 函数,它基于一个健的列表从关联数组中取出数组,具体的语法:

wp_array_slice_assoc( array $input_array, array $keys )
  • $input_array:待切片的关联数组。
  • $keys:健的列表。
// 从数组中取出键为 c 和 b 的元素
$slice = wp_array_slice_assoc(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], ['c', 'b', 'f']); 
// 结果为 ['c'=>3, 'b'=>2] 

取出的数组是按照 $keys 参数的顺序取出来的,上面的例子中,我故意把 c 放到 b 前面,取出的关联数组的 key 的顺序也是按照这个顺序,另外数组中不存在的 key,取出关联的数组也是不存在的,比如上面例子的 f。

WPJAM Basic 的 wpjam_slice

因为 wp_array_slice_assoc 取出的关联数组的顺序是按照输入的 $keys 参数顺序的,但是有些情况下我们要求取出的关联数组的顺序不要动,即不关系 $keys 的顺序,所以我在 #WPJAM Basic# 中加入了一个 wpjam_slice 函数,它取出的数组是不会变动的,具体的语法:

wpjam_slice( array $input_array, array $keys )
  • $input_array:待切片的关联数组。
  • $keys:健的列表。

还是看具体的例子吧:

// 从数组中取出键为 c 和 b 的元素
$slice = wpjam_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], ['c', 'b', 'f']); 
// 结果为 ['b'=>2, 'c'=>3] 

最后取出的关联数组的是按照原先的顺序,并且不存在的 key,取出关联的数组也是不存在的。

此外 $keys 参数除了数组之外,还支持字符串,通过空格或者逗号转化成数组:

// 从数组中取出键为 c 和 b 的元素,$keys 参数为逗号间隔字符串
$slice = wpjam_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], 'c,b,f']); 
// 结果也是 ['b'=>2, 'c'=>3]

// 从数组中取出键为单个元素
$slice = wpjam_slice(['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5], 'c']); 
// 结果为 ['c'=>3] 

这样 WordPress 中给数组如何切片,是不是方法更多了一下,哈哈!

中文环境下,WordPress 截取个摘要,竟然有那么多问题!

2024年9月8日 23:09

我们先从 WordPress 文章摘要功能说起,大部分 WordPress 主题在首页,分类搜索等各种列表页,会只显示文章摘要,而不显示文章内容全文,所以摘要很重要,在列表页,用户是否会点击查看这篇文章,摘要会起到很重要的效果。

怎么设置文章摘要

那么怎么设置摘要呢?在使用经典编辑器的年代,摘要是非常容易设置的,就在文章内容的下面,很多人写完文章,顺手也设置了文章摘要:

但是升级到古腾堡编辑器之后,很多人就发现不知道去哪里设置摘要了,摘要设置文本框被移到编辑器右侧文章设置的很下面,很多人没有认真去看,还以为没了。😅

甚至有些人因为这个原因,从来没有去设置过文章摘要,也有人因为这个原因坚持在用经典编辑器。😅

#WPJAM Basic# 插件支持一键屏蔽古腾堡编辑器,此外 #WPJAM Basic# 还提供一个扩展「摘要快速编辑」,让你可以在文章列表快速设置文章摘要:

使用文章摘要

设置了 WordPress 摘要,那就要去用,这个一般来说都是主题开发者的工作,这里简单了解一下就好,如果你要自己修改主题,那就就要认真看下。😄

WordPress 提供了两个文章摘要的模板函数,这个知道就好,一般主题就是使用这两个函数实现的。

1. get_the_excerpt( $post = null ) ,用于获取文章的摘要,它只有一个参数,就是 $post,可以是文章对象,或者文章 ID, 也可以不传,不传则获取当前文章的摘要。

2. the_excerpt(),直接输出当前文章的摘要,该函数没有任何参数,所以模板开发很简单,直接在文章列表页使用该模板函数即可。

自动获取文章摘要

由上可知,并不是每篇文章都设置了摘要,这个时候,WordPress 默认会自动获取:

WordPress 默认会使用 wp_trim_excerpt 去获取文章内容,加上摘要长度传递给 wp_trim_words 函数处理, wp_trim_words 会基于用户所处的环境:

  • 单词之间没有空格的,比如中日韩,它就按照中文字符和英文字符都算一个字符来截取。
  • 单词之间有空格的,比如英文或其他,它就按照空格或者回车来获取单词数组,截取输入长度的单词数。

这种算法对于中文来说,非常不好,因为一个中文字符,宽度基本上是一个英文字符的两倍,如果文章中的中英文混排的话,截取出来肯定会长度不一。

所以现在很多主题会加入自动摘要截取优化的代码,但是有些主题直接使用 substr 函数来获取摘要,该函数是把中文算成 3 个字符,英文字符算 1 个字符,这个算法有点奇怪,但是如果英文不多,截取的产地还算一致,但是比较致命的是,该函数无法判断一个完整的中文字符,截取的时候,可能在中文字符中间劈开了,然后就出现乱码:😅

所以对于中文环境,最好按照「中文 2 个字节,英文 1 个字节」的方式来截取,并且中文字符会当作一个完整的字符来处理,而采用该截取算法 PHP 函数则是 mb_strimwidth

mb_strimwidth($text, 0, 240, '...', 'utf-8');

为了方便大家的设置,我在 #WPJAM Basic# 集成了自动获取文章摘要的设置,无需修改任何代码,简单选择设置一下即可,点击「WPJAM」菜单下「文章设置」子菜单下之后可以看到:

当文章未设置摘要时候,默认还是 WordPress 默认自带的截取摘要的方式,然后 WPJAM Basic 插件增加了两个选项:

  • 第一个很简单直接:直接不显示摘要。
  • 第二个选项就是前面介绍的算法,按照中文最优方式截取,并且还可以设置文章摘要的长度。
    再次提醒一下注意算法是「中文 2 个字节,英文 1 个字节」,设置长度的时候要注意下。

这个时候再看看,除了第二篇是后台设置了摘要,其他三篇摘要都基本差不多长度了,并且也没有出现乱码:

mb_strimwidth 不存在?

写到这里,你是不是觉得 WordPress 摘要的问题已经解决了?现在还存在两个问题:

1. #WPJAM Basic# 的设置不生效,还是出现上面那种乱码,或者长短不一的情况。

因为插件的优化摘要的代码和主题优化摘要的代码优先级是不一定的,可能主题占优了,那么你这个时候应该咨询主题作者,让他提供选项,然后你可以关闭主题的摘要优化功能。

2. 直接报错了:

Call to undefined function mb_strimwidth()

好吧,mb_ 打头的函数,需要 PHP 安装 mb_string 扩展,在后台「WPJAM」菜单下的「系统信息」的子菜单中,可以快速查看:

所以我又升级了一下 #WPJAM Basic# ,做了兼容,就是说现在没有装该扩展,也有该函数了:

if(!function_exists('mb_strimwidth')){
	function mb_strimwidth($str, $start, $width, $trimmarker=''){
		preg_match_all('/./us', $str, $match);

		$count	= count($match[0]);
		$start	= $start < 0 ? $count-1+$start : $start;
		$chars	= array_slice($match[0], $start);

		if($width >= array_sum(wpjam_map($chars, fn($char)=> ord($char) >=224 ? 2 : 1))){
			return implode('', $chars);
		}

		$length	= 0;
		$result	= '';
		$count	-= $start;
		$width	-= strlen($trimmarker);

		for($i=0; $i<$count; $i++){
			$char	= $chars[$i];
			$w		= ord($char) >= 224 ? 2 : 1;

			if($length + $w > $width){
				break;
			}

			$result	.= $char;
			$length	+= $w;
		}

		return $result.$trimmarker;
	}
}

这就是我最近发现大家在设置 WordPress 文章摘要中碰到的问题。好累,一个摘要的问题写了那么长。😅

还有一点,文章摘如果设置得好,结合一些 SEO 插件,比如 WPJAM Basic 的「简单SEO」扩展,摘要也可以设置成 meta description,搜索引擎收录内容之后,在搜索结果页面显示的内容也是文章的摘要。

❌
❌