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

时间:2016-12-15 18:38:18

标签: json wordpress wordpress-theming advanced-custom-fields

我正在制作一个自定义主题,并在docs中提到的主题中包含了acf pro。主题工作正常,acf在主题激活时激活。这是代码。

acf-json

我现在面临几个小时的问题是由于我希望在acf中实例化的组/字段。我有一些字段组,我希望在全新安装时显示。以下是我尝试过的方法:

方法1: 我已将字段作为json导出到名为{{1}}的文件夹中。 ACF确实识别它并显示为同步字段。但是当我尝试同步它时,它只会创建一个新的空字段。

方法2: 我也尝试将字段组导出为php文件,然后将其包含在我的functions.php文件中,但acf无法识别此代码。

1 个答案:

答案 0 :(得分:0)

由于文档中缺少信息,在主题或插件中分发ACF有点棘手。棘手的部分是使用您的主题和插件导出您的字段,以便您的用户不必做任何不同的事情,然后他们习惯使用任何其他主题或插件。我将详细介绍该程序。

主题和插件开发:

参考official docs,将代码复制并粘贴到functions.php文件中进行主题开发应该非常容易,而对于插件开发,您可以将其添加到主插件文件中。这将完成这4项任务。

  1. 添加ACF路径
  2. 添加ACF目录
  3. 隐藏客户的ACF(如果需要)
  4. 包括ACF
  5. 到目前为止,你所做的事实上没有做任何特别的事情。它只是在您激活主题/插件时激活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文件的更改。您现在甚至可以控制它们以进行更好的控制。 **