Json 在自定义主题或插件中包含ACF(高级自定义字段):导出分发上的字段
我正在处理一个自定义主题,并已将acf pro包含在该主题中,如中所述。主题工作正常,主题激活时激活acf。这是代码Json 在自定义主题或插件中包含ACF(高级自定义字段):导出分发上的字段,json,wordpress,wordpress-theming,advanced-custom-fields,Json,Wordpress,Wordpress Theming,Advanced Custom Fields,我正在处理一个自定义主题,并已将acf pro包含在该主题中,如中所述。主题工作正常,主题激活时激活acf。这是代码 // customize ACF path add_filter('acf/settings/path', 'my_acf_settings_path'); function my_acf_settings_path( $path ) { $path = get_stylesheet_directory() . '/inc/advanced-custom-fields-p
// customize ACF path
add_filter('acf/settings/path', 'my_acf_settings_path');
function my_acf_settings_path( $path ) {
$path = get_stylesheet_directory() . '/inc/advanced-custom-fields-pro/';
return $path;
}
// customize ACF dir
add_filter('acf/settings/dir', 'my_acf_settings_dir');
function my_acf_settings_dir( $dir ) {
$dir = get_stylesheet_directory_uri() . '/inc/advanced-custom-fields-pro/';
return $dir;
}
// Include ACF
include_once( get_stylesheet_directory() . '/inc/advanced-custom-fields-pro/acf.php' );
我现在面临几个小时的问题是由于我希望在acf中实例化的组/字段。我有一些字段组希望在新安装中显示。以下是我尝试过的方法:
方法1:
我已将字段作为json导出到名为acf json
的文件夹中。ACF可以识别它并显示为同步字段。但当我尝试同步它时,它只会创建一个新的空字段
方法2:
我还尝试将字段组导出为php文件,然后将其包含在我的functions.php文件中,但acf无法识别此代码。在主题或插件中分发acf有点棘手,因为文档中缺少信息。棘手的部分是用你的主题和插件导出你的字段,这样你的用户就不必做任何与其他主题或插件不同的事情。我将详细介绍这个程序
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;
}
主题和插件开发:
关于主题开发,在functions.php文件中复制和粘贴代码应该非常容易,而在插件开发中,可以将其添加到主插件文件中。这将完成这4项任务
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文件的更改。您现在甚至可以对其进行版本控制,以实现更好的控制** 在主题或插件中分发ACF有点棘手,因为文档中缺少信息。棘手的部分是用你的主题和插件导出你的字段,这样你的用户就不必做任何与其他主题或插件不同的事情。我将详细介绍这个程序 主题和插件开发: 关于主题开发,在functions.php文件中复制和粘贴代码应该非常容易,而在插件开发中,可以将其添加到主插件文件中。这将完成这4项任务
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 ] );
}
}
}
**现在当你分发