Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 在自定义主题或插件中包含ACF(高级自定义字段):导出分发上的字段_Json_Wordpress_Wordpress Theming_Advanced Custom Fields - Fatal编程技术网

Json 在自定义主题或插件中包含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

我正在处理一个自定义主题,并已将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无法识别此代码。

在主题或插件中分发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项任务

  • 添加ACF路径
  • 添加ACF目录
  • 对客户端隐藏ACF(如果需要)
  • 包括ACF
  • 到目前为止,你所做的其实没有什么特别之处。它只会在你激活主题/插件时激活ACF,同样在主题/插件停用时停用ACF

    导出字段:(通过JSON同步)

    在这个阶段,如果你发布你的主题/插件,它只会激活ACF,但里面不会有任何字段。ACF使用JSON跟踪所有字段和字段组。默认情况下,ACF将在主题的根目录中查找名为ACF json的文件夹。如果您有此文件夹,ACF将为您添加或更新的每个字段组自动添加/更新一个新的json文件

    如果要将此文件夹保留在includes文件夹中,可以更改其位置。不知何故,您无法更改主题上的默认位置,但对于插件,您可以通过添加此代码来更改

    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项任务

  • 添加ACF路径
  • 添加ACF目录
  • 对客户端隐藏ACF(如果需要)
  • 包括ACF
  • 到目前为止,你所做的其实没有什么特别之处。它只会在你激活主题/插件时激活ACF,同样在主题/插件停用时停用ACF

    导出字段:(通过JSON同步)

    在这个阶段,如果你发布你的主题/插件,它只会激活ACF,但里面不会有任何字段。ACF使用JSON跟踪所有字段和字段组。默认情况下,ACF将在主题的根目录中查找名为ACF json的文件夹。如果您有此文件夹,ACF将为您添加或更新的每个字段组自动添加/更新一个新的json文件

    如果要将此文件夹保留在includes文件夹中,可以更改其位置。不知何故,您无法更改主题上的默认位置,但对于插件,您可以通过添加此代码来更改

    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 ] );
            }
        }
    }
    
    **现在当你分发