我正在制作一个自定义主题,并在docs中提到的主题中包含了acf pro。主题工作正常,acf在主题激活时激活。这是代码。
acf-json
我现在面临几个小时的问题是由于我希望在acf中实例化的组/字段。我有一些字段组,我希望在全新安装时显示。以下是我尝试过的方法:
方法1: 我已将字段作为json导出到名为{{1}}的文件夹中。 ACF确实识别它并显示为同步字段。但是当我尝试同步它时,它只会创建一个新的空字段。
方法2: 我也尝试将字段组导出为php文件,然后将其包含在我的functions.php文件中,但acf无法识别此代码。
答案 0 :(得分:0)
由于文档中缺少信息,在主题或插件中分发ACF有点棘手。棘手的部分是使用您的主题和插件导出您的字段,以便您的用户不必做任何不同的事情,然后他们习惯使用任何其他主题或插件。我将详细介绍该程序。
主题和插件开发:
参考official docs,将代码复制并粘贴到functions.php文件中进行主题开发应该非常容易,而对于插件开发,您可以将其添加到主插件文件中。这将完成这4项任务。
到目前为止,你所做的事实上没有做任何特别的事情。它只是在您激活主题/插件时激活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时,他们应该看到一个新的同步选项。在同步时,所有文件字段都应该可用。
自动执行SYNC流程:
如果你想完全隐藏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文件的更改。您现在甚至可以控制它们以进行更好的控制。 **