在主题或插件中分发 ACF 有点棘手,因为文档中缺少信息。棘手的部分是使用您的主题和插件导出您的字段,这样您的用户不必做任何与他们习惯使用任何其他主题或插件不同的事情。我将详细介绍该过程。
主题和插件开发:
参考official docs,将代码复制并粘贴到您的functions.php文件中以进行主题开发应该很容易,而对于插件开发,您可以将其添加到主插件文件中。这将完成这 4 项任务。
- 添加 ACF 路径
- 添加 ACF 目录
- 对客户端隐藏 ACF(如果需要)
- 包括 ACF
到目前为止,您所做的实际上并没有做任何特别的事情。它只会在您激活主题/插件时激活 ACF,并且在主题/插件停用时同样停用 ACF。
导出字段:(通过 JSON 同步)
在这个阶段,如果您分发主题/插件,它只会激活 ACF,但其中不会包含任何字段。 ACF 使用 JSON 来跟踪所有字段和字段组。默认情况下,ACF 将在主题的根目录中查找名为 acf-json 的文件夹。如果你有这个文件夹,那么 ACF 会自动为你添加或更新的每个字段组添加/更新一个新的 json 文件。
如果您想将其保留在您的包含文件夹中,您可以更改此文件夹的位置。不知何故,您无法更改主题的默认位置,但对于插件,您可以通过添加此代码。
add_filter('acf/settings/save_json', 'set_acf_json_save_folder');
function set_acf_json_save_folder( $path ) {
$path = dirname(__FILE__) . '/includes/acf-json';
return $path;
}
add_filter('acf/settings/load_json', 'add_acf_json_load_folder');
function add_acf_json_load_folder( $paths ) {
unset($paths[0]);
$paths[] = dirname(__FILE__) . '/includes/acf-json';
return $paths;
}
现在,如果您与某人共享此主题/插件,当他们进入 ACF 时,他们应该会看到一个新的同步选项。在同步所有文件时,他们应该可以使用字段。
自动化同步过程:
如果您想完全隐藏 ACF,那么显然您不能让您的用户进入 ACF 并同步字段。因此,在这种情况下,您需要一个脚本来自动同步 json 文件夹中的所有字段。您可以将此代码添加到您的 functions.php 主题中或您的主插件文件中。您不必更改此脚本中的任何路径,因为在前面的代码中您已经告诉 ACF 从何处加载 JSON 文件。
add_action( 'admin_init', 'article_gamification_sync_acf_fields' );
function article_gamification_sync_acf_fields() {
// vars
$groups = acf_get_field_groups();
$sync = array();
// bail early if no field groups
if( empty( $groups ) )
return;
// find JSON field groups which have not yet been imported
foreach( $groups as $group ) {
// vars
$local = acf_maybe_get( $group, 'local', false );
$modified = acf_maybe_get( $group, 'modified', 0 );
$private = acf_maybe_get( $group, 'private', false );
// ignore DB / PHP / private field groups
if( $local !== 'json' || $private ) {
// do nothing
} elseif( ! $group[ 'ID' ] ) {
$sync[ $group[ 'key' ] ] = $group;
} elseif( $modified && $modified > get_post_modified_time( 'U', true, $group[ 'ID' ], true ) ) {
$sync[ $group[ 'key' ] ] = $group;
}
}
// bail if no sync needed
if( empty( $sync ) )
return;
if( ! empty( $sync ) ) { //if( ! empty( $keys ) ) {
// vars
$new_ids = array();
foreach( $sync as $key => $v ) { //foreach( $keys as $key ) {
// append fields
if( acf_have_local_fields( $key ) ) {
$sync[ $key ][ 'fields' ] = acf_get_local_fields( $key );
}
// import
$field_group = acf_import_field_group( $sync[ $key ] );
}
}
}
**现在,当您分发主题/插件时,激活时它也会激活 ACF,然后复制所有 json 文件并执行它们。这将自动同步所有字段组,现在您甚至可以隐藏您的 ACF 插件,并且您的用户都不必进入 ACF 来同步字段,事实上他们甚至不必知道他们的站点上存在 ACF。其次,即使您在 ACF 中进行了新的更改,它也应该自动更新对 json 文件的更改。您现在甚至可以对它们进行版本控制以获得更好的控制。 **