🆕 Bricks 2.4 已发布:查询循环性能提升 40%,迁移教程同步更新 →

首页 / 中文教程 / 教程

Bricks 自定义查询类型:输出 Meta Box 可克隆字段

教程:Bricks 自定义查询类型:输出 Meta Box 可克隆字段——meta box 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。

Ray ChanRay Chan·2026-08-11·约 3 分钟
目录
  1. 1.可克隆字段的两种输出路线
  2. 2.Step 1:字段与模板准备
  3. 3.Step 2:注册自定义查询类型
  4. 4.Step 3:空值时不渲染整块

可克隆字段的两种输出路线

Meta Box 的可克隆(Cloneable)字段让用户添加任意多个同类型值:一门课程可以填 3 个上课日期,一个活动可以填多张图片。这些值在数据库里是一组记录,Bricks 内置查询类型里没有直接对应的(内置的 MB Group 是针对 Group 类型字段的),所以输出有两条路线:

  1. Code 元素路线:用 Meta Box 生成的代码(如 foreach ( rwmb_meta( 'course_dates' ) ... ))直接输出 HTML。快、简单,但样式只能写死在 HTML 里;

  2. 自定义查询类型路线:注册一个查询类型,让每个值变成一个循环项,循环项里用 Basic Text 等 Bricks 元素排版,样式完全在构建器里调。

两条路线都成立,本文讲的是第二种——它更符合“用 Bricks 元素做视觉样式”的需求,同时和上一篇 Checkbox List 一样,本质是“任意数组变查询循环”通用模式的复用。

Step 1:字段与模板准备

  1. 课程 CPT(course)上挂一个字段组,加一个 Date Picker 字段,ID course_dates,勾选 Cloneable(可克隆)。

  2. 给某门课填 2-3 个日期;再留一门课不填,用来验证条件渲染。

  3. 用 Bricks 编辑课程单篇模板,搭一个 Section,里面放 Block 准备挂循环。

Step 2:注册自定义查询类型

// 1. 注册查询类型
add_filter( 'bricks/query/register_types', function( $query_types ) {
  $query_types['bl_mb_cloneable'] = [
    'name'     => 'BL MB Cloneable',
    'supports' => [ 'field' ],
  ];
  return $query_types;
} );
// 2. 把可克隆字段的每个值变成一个循环项
add_filter( 'bricks/query/run', function( $results, $query, $query_type ) {
  if ( $query_type !== 'bl_mb_cloneable' || ! function_exists( 'rwmb_meta' ) ) {
    return $results;
  }
  $object_id = isset( $query['object_id'] ) ? $query['object_id'] : get_the_ID();
  $dates     = (array) rwmb_meta( 'course_dates', [ 'object_type' => 'post' ], $object_id );
  $results = [];
  foreach ( $dates as $i => $date ) {
    $results[] = (object) [
      'ID'   => $i + 1,
      'date' => $date,
    ];
  }
  return $results;
}, 10, 3 );
// 3. 配套动态标签:输出循环项的 date 属性
add_filter( 'bricks/dynamic_data/tags', function( $tags ) {
  $tags['bl_cloneable_date'] = [
    'label'  => 'BL Cloneable Date',
    'render' => 'bl_render_cloneable_date',
  ];
  return $tags;
} );
function bl_render_cloneable_date( $tag, $post, $context, $name ) {
  if ( is_object( $post ) && isset( $post->date ) ) {
    return $post->date;
  }
  return '';
}

然后在模板里:Block 启用查询循环,查询类型选 BL MB Cloneable,循环项放 Basic Text 插入 {bl_cloneable_date}。前端每门课列出全部上课日期。

两个细节:

  • 日期格式:Date Picker 默认按字段设置的 Save format 返回字符串(如 Y-m-d)。如果字段设了“存为时间戳”,$post->date 是数字,渲染函数里加一行 return date( 'Y-m-d', (int) $post->date ); 转成可读格式;

  • rwmb_meta 对可克隆字段:返回“每个值一个元素”的数组,所以 foreach 直接遍历即可,这也是和普通字段最大的区别。

另外,这套循环项还可以继续嵌套:循环项里的 $post 就是当前的日期值对象,如果哪天需求变成“每个日期下面再列该日期的名额数(另一个可克隆字段)”,在循环项里再挂一层自定义查询类型、读取时按日期匹配即可——查询循环的嵌套能力对自定义类型同样开放。

相关阅读:

Step 3:空值时不渲染整块

客户不会喜欢“没有日期的课程也显示一个空标题栏”。做法:注册一个计数动态标签,配合 Bricks 元素条件:

// 4. 计数标签:返回可克隆字段的值数量
add_filter( 'bricks/dynamic_data/tags', function( $tags ) {
  $tags['bl_cloneable_count'] = [
    'label'  => 'BL Cloneable Count',
    'render' => 'bl_render_cloneable_count',
  ];
  return $tags;
} );
function bl_render_cloneable_count( $tag, $post, $context, $name ) {
  if ( ! function_exists( 'rwmb_meta' ) ) {
    return '0';
  }
  return (string) count( (array) rwmb_meta( 'course_dates', [ 'object_type' => 'post' ], get_the_ID() ) );
}

构建器里:选中放循环的整个 Section,在元素设置的 Conditions(条件)里加一条——动态数据 {bl_cloneable_count} 不等于 0 时显示。保存后,没填日期的课程整块 Section 直接消失,填了的正常显示。

小结:Meta Box 可克隆字段的查询循环方案 = 注册查询类型 + rwmb_meta 遍历取值 + 动态标签渲染,再加一个计数标签做条件渲染。它和 Checkbox List 那篇是同一套“数组变循环”模板的两次应用——把 rwmb_meta( 'course_dates' ) 换成任意返回数组的函数(图片字段的 ID 列表、Select 多选值等),循环项属性跟着改就行。如果只是要快速输出 HTML,Code 元素路线更快;要视觉样式可控,就用这套。

适用场景

可克隆(Cloneable)字段适合「同一个字段要填任意多个值」的场景:一门课多个开课日期、一个活动多张图、一个产品多个规格。它和 Group 字段不同——Cloneable 是「同一字段多个值」,Group 是「一组子字段」;Bricks 内置的 MB Group 查询类型对应的是后者。本篇的计数动态标签 + Conditions 隐藏,是解决「没填数据就整块不显示」的通用手法,任何可克隆字段都能套用。

常见问题(FAQ)

Q:可克隆字段和 Group 字段一样吗? A:不一样。Cloneable 是同一字段多个值,Group 是一组子字段;Bricks 内置的 MB Group 查询类型对应后者。

Q:字段为空时怎么让整块不显示? A:用计数动态标签配合 Conditions,设置「不等于 0 时才显示」整段 Section 即可。

Q:和 Checkbox List 那篇是什么关系? A:同一套「数组变循环」模板的两次应用,把取值函数换一下就能互相通用。

延伸阅读

Ray Chan

站长

Ray Chan

WordPress Developer & Bricks Specialist

WordPress developer with 10+ years of client builds. Switched to Bricks in 2023 — now builds fast WordPress sites and migrates legacy Elementor/Divi projects.

延伸阅读