个性化阅读
专注于IT技术分析

在自定义主题或插件中包括ACF(高级自定义字段):在分发中导出字段

我正在研究一个自定义主题, 并在文档中提到了该主题内包含的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个任务。

  1. 添加ACF路径
  2. 添加ACF目录
  3. 对客户端隐藏ACF(如果需要)
  4. 包括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文件的更改更新。你现在甚至可以对它们进行版本控制, 以实现更好的控制。 **

赞(0) 打赏
未经允许不得转载:srcmini » 在自定义主题或插件中包括ACF(高级自定义字段):在分发中导出字段
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏