有些WordPress主题带有文章阅读量或点击量功能,但新发布的文章阅读量默认从0开始。
如果希望新文章首次发布时自动生成一个随机阅读量,可以通过WordPress自带的发布状态钩子实现,不需要额外安装插件,也不需要修改WordPress核心文件。
例如,可以让每篇新发布的文章在100到500之间随机生成一个初始阅读量。
需要说明的是,随机生成的数字不是真实访问统计,更适合用于测试环境、演示网站或历史数据迁移,不建议将其作为真实阅读量对外展示。
一、不要直接修改wp-admin/post.php
网上有一种旧方法,是打开WordPress根目录下的:
wp-admin/post.php
然后搜索:
case 'editpost'
在下面直接修改$_POST数据。
这种方法已经不推荐使用,主要有以下原因:
wp-admin/post.php属于WordPress核心文件;- WordPress升级后,修改过的内容会被覆盖;
- 不同WordPress版本的代码行数和结构不同;
- 直接修改
$_POST依赖后台内部处理流程; - 当前区块编辑器可能不会按照旧代码预期的方式保存字段;
- 修改错误可能导致后台无法发布或编辑文章。
正确做法是使用WordPress官方提供的动作钩子,在文章状态首次变成“已发布”时写入阅读量。
二、确认文章阅读量字段
WordPress核心默认没有文章阅读量统计功能。
主题或阅读量插件一般会把阅读量保存为文章自定义字段,常见字段包括:
views
post_views_count
本文代码默认使用:
views
只有当前主题也读取views字段时,随机生成的阅读量才会显示在前台。
如果主题使用的是post_views_count,需要将代码中的views替换为post_views_count。
还有一些统计插件会把数据保存在独立的数据表中,这种情况下,本文方法不会生效。WordPress文章元数据本质上是由主题或插件定义的键值数据。
三、打开子主题的functions.php文件
建议将代码添加到当前子主题的functions.php文件中,文件路径通常是:
/wp-content/themes/你的子主题/functions.php
可以通过服务器控制面板、虚拟主机文件管理器、FTP或SFTP打开该文件。
修改之前,建议先备份functions.php。
不建议直接修改父主题,因为父主题升级后,自定义代码可能会被覆盖。WordPress官方也建议通过子主题保存自定义修改。
如果文件开头已经存在:
<?php
直接在文件末尾添加代码即可,不要重复添加<?php。
四、新文章自动生成随机阅读量的代码
将以下代码添加到子主题的functions.php文件中:
/**
* 新文章首次发布时,生成随机初始阅读量。
*
* @param string $new_status 新的文章状态。
* @param string $old_status 原来的文章状态。
* @param WP_Post $post 当前文章对象。
*/
function jaaai_add_random_views_on_first_publish( $new_status, $old_status, $post ) {
// 只在文章首次进入“已发布”状态时执行。
if ( 'publish' !== $new_status || 'publish' === $old_status ) {
return;
}
// 只处理普通文章,不处理页面、附件和其他内容类型。
if ( 'post' !== $post->post_type ) {
return;
}
// 在100到500之间生成随机阅读量。
$random_views = wp_rand( 100, 500 );
// 只在views字段不存在时添加,避免覆盖已有阅读量。
add_post_meta( $post->ID, 'views', $random_views, true );
}
add_action(
'transition_post_status',
'jaaai_add_random_views_on_first_publish',
10,
3
);
保存文件以后,在WordPress后台新建并发布一篇文章。
如果主题使用views字段显示阅读量,新文章就会自动获得一个100到500之间的随机初始值。
transition_post_status是WordPress官方提供的文章状态变化钩子。代码通过比较新旧状态,确保只在文章进入发布状态时执行,而不是每次修改文章都重新生成数字。WordPress钩子说明
五、如何修改随机阅读量范围?
下面这行代码控制随机阅读量的最小值和最大值:
$random_views = wp_rand( 100, 500 );
其中:
100是最小阅读量;500是最大阅读量。
如果希望随机生成1000到5000之间的阅读量,可以改成:
$random_views = wp_rand( 1000, 5000 );
如果希望范围是50到200,可以改成:
$random_views = wp_rand( 50, 200 );
wp_rand()会返回包含最小值和最大值在内的随机整数,也就是说wp_rand(100, 500)可能生成100,也可能生成500。
六、为什么不使用mt_rand()?
原来的代码使用:
mt_rand( 100, 500 );
这段PHP代码本身可以生成随机数,但在WordPress中,更推荐使用系统自带的:
wp_rand( 100, 500 );
wp_rand()是WordPress提供的随机数函数,与WordPress运行环境的兼容性更好,也更符合WordPress代码规范。
七、为什么要使用add_post_meta()?
代码使用下面的方法保存阅读量:
add_post_meta( $post->ID, 'views', $random_views, true );
最后一个参数true表示同一篇文章只允许添加一个views字段。
如果文章已经存在views字段,WordPress不会重复添加,也不会覆盖当前阅读量。
这样可以避免因为文章重复发布、状态变化或其他操作,导致阅读量被重新随机。
八、以前发布的文章会受到影响吗?
正常情况下不会。
这段代码只在文章从未发布状态变成已发布状态时执行,例如:
草稿 → 已发布
待审核 → 已发布
定时发布 → 已发布
私密文章 → 已发布
普通编辑已经发布的文章时,文章状态仍然是:
已发布 → 已发布
代码会直接退出,不会重新生成阅读量,也不会覆盖原来的数字。
但是,如果把以前的文章改成草稿,然后再次发布,并且该文章原本没有views字段,那么它也可能生成随机阅读量。
九、如何让页面也生成随机阅读量?
本文代码只处理普通文章:
if ( 'post' !== $post->post_type ) {
return;
}
如果希望普通文章和页面都生成随机阅读量,可以改成:
if ( ! in_array( $post->post_type, array( 'post', 'page' ), true ) ) {
return;
}
如果使用的是自定义文章类型,还可以把对应的文章类型名称加入数组。
不清楚自定义文章类型名称时,不建议随意修改。
十、发布文章后没有显示阅读量怎么办?
可以依次检查以下问题:
- 当前主题是否真的使用
views字段; - 主题是否使用了
post_views_count等其他字段; - 阅读量数据是否保存在插件自己的数据表中;
- 代码是否添加到了当前正在使用的主题;
functions.php是否出现PHP语法错误;- 网站页面缓存、对象缓存或CDN缓存是否已经清理;
- 文章是否真正进入了“已发布”状态。
也可以进入phpMyAdmin,在当前网站的postmeta数据表中搜索:
views
如果能够找到对应文章ID和随机数,说明代码已经成功写入,只是主题没有读取这个字段。
十一、更换主题后代码还会生效吗?
不会。
functions.php属于主题文件,更换主题以后,原主题中的代码不会继续运行。
如果经常更换主题,或者希望这项功能与主题完全独立,更规范的做法是将代码封装成站点专用插件或必须使用插件。
不过,在明确不安装插件的前提下,使用子主题的functions.php,已经比修改wp-admin/post.php安全得多。
通过WordPress官方钩子实现随机阅读量,不仅兼容性更好,也不会因为WordPress核心升级而失效。
最终推荐的核心代码是:
function jaaai_add_random_views_on_first_publish( $new_status, $old_status, $post ) {
if (
'publish' !== $new_status ||
'publish' === $old_status ||
'post' !== $post->post_type
) {
return;
}
add_post_meta(
$post->ID,
'views',
wp_rand( 100, 500 ),
true
);
}
add_action(
'transition_post_status',
'jaaai_add_random_views_on_first_publish',
10,
3
);
保存代码后,新文章首次发布时,就会在指定范围内自动生成随机初始阅读量,并且不会因为以后编辑文章而重复生成。