WordPress 7.2 给内容发现加了一个有点「调皮」但很实用的功能:新的 /random/ 端点。访问 你的站点/random/ 会被重定向到一篇随机选中的已发布文章。该功能默认开启,构建在已有的 rewrite 、WP 与 WP_Query API 之上。如果你有正当理由不想启用,或者就是不喜欢,也有过滤器可以整体关闭。作为 7.2 系列的一部分,它和 WordPress 7.2 Beta 4、WordPress 7.2 Beta 1 一起,让这个版本在「内容体验」上多了些巧思。
随机 URL 怎么写
随机基址(base)会前缀到现有的归档路径之前。这个默认基址可翻译、可自定义——在 wp-admin/options-permalink.php 的固定连接设置里新增了一个选项。在默认基址 + 美观固定连接下,会生成如下规则:
/random/跳转到一篇随机文章;/random/category/release/跳转到 release 分类下的一篇随机文章;任何挂在合格文章类型上的、可公开查询的分类法都有类似规则,例如/random/tag/dev-note/;/random/author/jorbin/跳转到该作者的一篇随机文章;/random/{文章类型别名}/跳转到某个可随机的自定义文章类型下的一篇随机文章。
哪些文章类型可被随机
register_post_type() 新增 randomable 参数控制是否可被随机。未设置时,默认对 publicly_queryable 且设置了 has_archive 的文章类型为 true。内置类型里,post 可被随机;page 与 attachment 不可。
register_post_type(
'musicals',
array(
'public' => true,
'has_archive' => true,
'randomable' => false, // 让 musicals 不进入 /random/
)
);
想让随机「没那么随机」:定制化选择
随机文章由主查询选出。WP::handle_random() 在请求期间给主查询挂了三个回调:pre_get_posts 上的 wp_random_content_pre_get_posts()、posts_orderby 上的 wp_random_content_posts_orderby()、post_limits 上的 wp_random_content_post_limits()——它们把查询限制在合格文章内、按 RAND() 排序、结果限制为 1 行。
因为选择走的是主查询,已有的、用来定制某个归档的 pre_get_posts 回调同样会作用于它对应的随机重定向。如果只想针对随机请求改选择,用 wp_is_random_content_query() 判断:
add_action(
'pre_get_posts',
static function ( WP_Query $query ) {
if ( wp_is_random_content_query( $query ) ) {
$query->set( 'category__not_in', array( 525600 ) );
}
}
);
不想要随机?一行过滤器关掉
如果希望站点上完全禁用随机重定向,可以用 wp_enable_random_content_redirect 过滤器。一个极简的 mu-plugin:add_filter( 'wp_enable_random_content_redirect', '__return_false' ); 即可——这样不会生成随机重写规则、固定连接页面会隐藏随机基址字段、随机查询变量也会被忽略。
更多细节可看 Trac #64498 与 changeset r64402 / r64405 / r65042 / r65250 。
实战:为站点启用并定制随机端点
步骤一:确认站点已升级到 WordPress 7.2(Beta 或正式版均可体验该端点)。
步骤二:进入 设置 → 固定连接,找到随机基址选项,可把默认的 random 改成你喜欢的词(支持翻译)。
步骤三:如需排除某些分类,用 wp_is_random_content_query() 配合 pre_get_posts 设置 category__not_in 。
步骤四:如需关闭整个功能,写个 mu-plugin 调用 add_filter(‘wp_enable_random_content_redirect’, ‘__return_false’)。
步骤五:在前台访问 /random/ 与 /random/category/你的分类/ 验证重定向是否生效。
常见问题
默认开启,但它只新增重写规则与端点,不会改动你已有的文章固定链接;访问 /random/ 会重定向到一篇随机选中的已发布文章。
用 wp_is_random_content_query() 在 pre_get_posts 里判断,再 set category__not_in 等参数;或把自定义文章类型的 randomable 参数设为 false,直接排除该类型。
能。在 mu-plugin 里调用 add_filter(‘wp_enable_random_content_redirect’, ‘__return_false’) 即可整体关闭,对应的重写规则与固定连接设置项都会一并隐藏。
「进阶:底层是怎么实现的」
随机选择由 WP::handle_random() 完成,向主查询临时挂载 wp_random_content_pre_get_posts / wp_random_content_posts_orderby / wp_random_content_post_limits 三个回调,分别负责限制合格文章、按 RAND() 排序、把结果限制为单行。由于完全走主查询,所有既有的 pre_get_posts 逻辑都会自然复用,这也正是「用 wp_is_random_content_query() 判断」能精准收窄随机范围的原因。详见 Trac #64498 与对应 changeset 。










评论 (0)