2016-12-15 75 views
0

我正在处理自定义主题,并在docs中提到了在该主题中包含acf pro的内容。主题工作正常,acf在主题激活时激活。这是代码。在自定义主题或插件中包含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: 我已经导出字段名为acf-json文件夹内JSON。 ACF确认并显示为同步字段。但是当我尝试同步它时,它只是创建一个新的空字段。

方法2: 我也曾尝试导出字段组为PHP文件,然后包括它在我functions.php文件,但ACF不承认这个代码。

+0

我从来没有尝试过这样做,但有一种方法可以编程方式创建字段组和字段。然后你可以在你的主题中包含一个php文件来定义你的字段。 https://www.advancedcustomfields.com/resources/register-fields-via-php/ – Joe

+0

乔提到的是我会推荐的。我已经做到了,它的工作原理。 – Aibrean

+0

谢谢你们,我知道关于php导出功能,但我正在考虑更精简的东西。如果有兴趣,我在下面的答案中解释了我的解决方案。 –

回答

0

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

为主题和插件开发:

参考的official docs,它应该是很容易复制和粘贴在主题发展到functions.php文件中的代码,而对于插件的开发,你可以将其添加到主要的插件文件。这将完成这4项任务。

  1. 添加ACF路径
  2. 添加ACF迪尔
  3. 隐藏ACF从客户端(如果需要)
  4. 包括ACF

到现在为止,你已经做实际上并没有做任何事情什么特别。它只是激活你的主题/插件时激活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时,他们应该会看到一个新的同步选项。同步所有文件字段应该可用。

Automatting同步过程:

如果你想隐藏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文件的更改。你现在甚至可以通过版本控制它们以获得更好的控**

相关问题