flyntwp / acf-field-group-composer
Requires
- composer/installers: ~1.0 || ~2.0
Requires (Dev)
- brain/monkey: ^2.6
- phpunit/phpunit: ^9.6
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2024-09-18 11:06:51 UTC
README
高级自定义字段字段组的配置构建器
此插件可以帮助您使用代码创建可重用的ACF字段和字段组。
目录
背景
ACF为WordPress中创建自定义元框提供了很好的界面。然而,使用它时存在两个主要缺点
- 如果您有很多自定义字段,通过其GUI配置ACF可能会很麻烦。而且通过GUI创建的字段只存储在数据库中。这意味着迁移不同开发阶段之间的字段只能通过迁移数据库来完成。
- 本地JSON功能和
add_local_field_group
对于将配置检入SCM并将其部署到不同环境很有用,但它缺乏一些可定制性,例如在不同上下文中重用先前指定的字段。
acf-field-group-composer有助于克服这些缺点。它允许您使用内置的add_local_field_group
功能,并为所有添加的字段自动添加唯一键。此外,如果一个字段不是数组而是字符串,它将应用该名称的过滤器,并使用返回值作为配置中的新字段。
安装
待办事项:通过WordPress说明进行安装
要通过composer安装,运行
composer require flyntwp/acf-field-group-composer
使用
要注册字段组,运行
ACFComposer\ACFComposer::registerFieldGroup($config);
$config
变量应与您传递给acf_add_local_field_group
的格式相同。只有两件事是不同的
- 您不需要在任何字段或组中指定
key
。 - 字段组需要一个唯一的
name
属性。
按照ACF从这里提供的最小示例
$config = [ 'name' => 'group1', 'title' => 'My Group', 'fields' => [ [ 'label' => 'Subtitle', 'name' => 'subtitle', 'type' => 'text' ] ], 'location' => [ [ [ 'param' => 'post_type', 'operator' => '==', 'value' => 'post' ] ] ] ];
为了使用acf-field-group-composer的附加功能,您可以在过滤器中提取指定的字段并返回它。过滤器的名称可以是任何名称,但我们建议使用有意义的命名方案。例如
add_filter('MyProject/ACF/fields/field1', function ($field) { return [ 'label' => 'Subtitle', 'name' => 'subtitle', 'type' => 'text' ]; }); $config = [ 'name' => 'group1', 'title' => 'My Group', 'fields' => [ 'MyProject/ACF/fields/field1' ], 'location' => [ [ [ 'param' => 'post_type', 'operator' => '==', 'value' => 'post' ] ] ] ];
同样可以为位置做相同的事情
add_filter('MyProject/ACF/locations/postTypePost', function ($location) { return [ 'param' => 'post_type', 'operator' => '==', 'value' => 'post' ]; }); $config = [ 'name' => 'group1', 'title' => 'My Group', 'fields' => [ 'MyProject/ACF/fields/field1' ], 'location' => [ [ 'MyProject/ACF/locations/postTypePost' ] ] ];
结合前面的步骤将得到以下结果
add_filter('MyProject/ACF/fields/field1', function ($field) { return [ 'label' => 'Subtitle', 'name' => 'subtitle', 'type' => 'text' ]; }); add_filter('MyProject/ACF/locations/postTypePost', function ($location) { return [ 'param' => 'post_type', 'operator' => '==', 'value' => 'post' ]; }); $config = [ 'name' => 'group1', 'title' => 'My Group', 'fields' => [ 'MyProject/ACF/fields/field1' ], 'location' => [ [ 'MyProject/ACF/locations/postTypePost' ] ] ]; ACFComposer\ACFComposer::registerFieldGroup($config);
执行此代码将向所有文章添加一个名为subtitle
的字段。键将是字段组名称、所有父字段名称(如果字段有父字段)以及字段本身的名称的组合。在这种情况下,这是field_group1_subtitle
。
过滤器参数
当与ACF中的可重用组件一起工作时,还存在另一个问题。虽然ACF Pro中的灵活内容字段为您提供了添加同一类型多个组件到字段组的所有所需功能,但对于常规字段组来说,这是不可能的。
例如,如果您为简单的WYSIWYG组件定义了一组字段,然后想要将其多次添加到字段组中,结果将是显示两个Wysiwyg组件,但每个组件都具有相同的名称,从而覆盖彼此的数据。
add_filter('MyProject/ACF/fields/wysiwyg', function ($field) { return [ 'label' => 'Content', 'name' => 'content', 'type' => 'wysiwyg' ]; }); $config = [ 'name' => 'group1', 'title' => 'My Group', 'fields' => [ 'MyProject/ACF/fields/wysiwyg', 'MyProject/ACF/fields/wysiwyg' ], 'location' => [ [ 'MyProject/ACF/locations/postTypePost' ] ] ]; ACFComposer\ACFComposer::registerFieldGroup($config);
可以通过添加过滤器参数来解决这个问题。所有过滤器参数都必须以#结尾。一旦这样做,相应的过滤器将以后缀作为第二个参数被调用,字段名称将以前缀字符串开头。
例如,在之前的损坏代码中添加两个唯一的过滤器名称可以解决这个问题
add_filter('MyProject/ACF/fields/wysiwyg', function ($field, $componentName) { return [ 'label' => 'Content', 'name' => 'content', 'type' => 'wysiwyg' ]; }, 10, 2); $config = [ 'name' => 'group1', 'title' => 'My Group', 'fields' => [ 'MyProject/ACF/fields/wysiwyg#firstWysiwyg', 'MyProject/ACF/fields/wysiwyg#secondWysiwyg' ], 'location' => [ [ 'MyProject/ACF/locations/postTypePost' ] ] ]; ACFComposer\ACFComposer::registerFieldGroup($config);
因此,以下两个字段被添加到所有帖子中
这些字段可以通过ACF函数get_field()
和get_fields()
像平常一样访问。
条件逻辑
可以在字段上添加条件逻辑,方式与ACF相同。例外的是,我们可以传递fieldPath
而不是field
。fieldPath
必须引用同一配置中定义的字段的名称
{ "label": "Show Content Field", "name": "showContentField", "type": "true_false" }, { "label": "Content", "name": "contentHtml", "type": "wysiwyg", "conditional_logic": [ [ { "fieldPath": "showContentField", "operator": "==", "value": "1" } ] ] }
当在嵌套的子字段内部(例如,在重复器中)引用字段时,必须传递相对于当前级别的fieldPath
。例如
{ "label": "Show Content Field", "name": "showContentField", "type": "true_false" }, { "label": "Content Repeater", "name": "contentRepeater", "type": "repeater", "sub_fields": [ { "label": "Content", "name": "contentHtml", "type": "wysiwyg", "conditional_logic": [ [ { "fieldPath": "../showContentField", "operator": "==", "value": "1" } ] ] } ] }
API
ACFComposer\ACFComposer(类)
registerFieldGroup(静态)
该包的主要功能。通过acf_add_local_field_group
解析给定的字段组配置并注册ACF字段组。
public static function registerFieldGroup(array $config)
ACFComposer\ResolveConfig(类)
forFieldGroup(静态)
通过添加键和将过滤器字符串替换为实际内容,从给定的配置数组中验证和生成字段组配置。
public static function forFieldGroup(array $config)
forField(静态)
通过添加键和将过滤器字符串替换为实际内容,从给定的配置数组中验证和生成字段配置。
public static function forField(array $config, array $parentKeys = [])
forLayout(静态)
通过添加键和将过滤器字符串替换为实际内容,从给定的配置数组中验证和生成布局配置。
public static function forLayout(array $config, array $parentKeys = [])
forLocation(静态)
从给定的配置数组中验证位置配置。
public static function forLocation(array $config)
维护者
该项目由bleech维护。
负责此存储库的主要人员是
贡献
要贡献,请使用GitHub 问题。接受拉取请求。请花些时间阅读贡献指南和行为准则。
如果编辑README,请符合标准README规范。
许可
MIT © bleech