我正在研究一个自定义主题, 并在文档中提到了该主题内包含的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-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无法识别此代码。
#1
由于文档中缺乏信息, 因此在主题或插件中分发ACF有点棘手。棘手的部分是使用主题和插件导出字段, 以使用户不必执行与使用其他主题或插件所需要的操作不同的方式。我将详细介绍该过程。
对于主题和插件开发:
参考官方文档, 将代码复制并粘贴到functions.php文件中以进行主题开发应该非常容易, 而对于插件开发, 你可以将其添加到主插件文件中。这将完成这4个任务。
- 添加ACF路径
- 添加ACF目录
- 对客户端隐藏ACF(如果需要)
- 包括ACF
到目前为止, 你所做的实际上并没有什么特别的。只要你激活主题/插件, 它就会激活ACF, 并且在主题/插件停用时同样会禁用ACF。
导出字段:(通过JSON同步)
在此阶段, 如果你分发主题/插件, 它将仅激活ACF, 但其中将没有任何字段。 ACF使用JSON来跟踪所有字段和字段组。默认情况下, ACF将在主题的根目录中查找名为acf-json的文件夹。如果你有此文件夹, 则ACF将为你添加或更新的每个字段组自动添加/更新一个新的json文件。
如果要将其保留在include文件夹中, 则可以更改此文件夹的位置。你无法以某种方式更改主题的默认位置, 但是对于插件, 可以通过添加此代码来实现。
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文件的更改更新。你现在甚至可以对它们进行版本控制, 以实现更好的控制。 **
评论前必须登录!
注册