Skip to content

Instantly share code, notes, and snippets.

@thomascharbit
Created October 1, 2014 18:26
Show Gist options
  • Save thomascharbit/54fc4296fda3de4f4f52 to your computer and use it in GitHub Desktop.
Save thomascharbit/54fc4296fda3de4f4f52 to your computer and use it in GitHub Desktop.
ACF field groups sync for developers
<?php
define( 'ACF_FIELDS_VERSION', '1.0.1');
if ( 'development' == WP_ENV ) {
// save fields to JSON
add_filter('acf/settings/save_json', 'lc_json_save_point');
// Sync fields if nececessary
add_action('init', 'lc_check_acf_fields_version');
}
else {
// don't show ACF UI
add_filter('acf/settings/show_admin', '__return_false');
// load fields from JSON
add_filter('acf/settings/load_json', 'lc_json_load_point');
}
// Sync fields if nececessary
add_action('init', 'lc_check_acf_fields_version');
function lc_check_acf_fields_version() {
$db_version = get_option( 'acf_fields_version' );
if ( version_compare( ACF_FIELDS_VERSION, $db_version ) > 0 ) {
lc_import_json_field_groups();
update_option( 'acf_fields_version', ACF_FIELDS_VERSION );
}
}
// Import field groups from local JSON to make them editable via Admin UI (dev mode)
function lc_import_json_field_groups() {
// tell ACF NOT to save to JSON
add_filter('acf/settings/save_json', 'lc_import_json_save_no_point', 99 );
// Remove previous field groups in DB
$args = array(
'post_type' => 'acf-field-group',
'post_status' => 'any',
'posts_per_page' => -1
);
$query = new WP_Query( $args );
foreach ( $query->posts as $acf_group ) {
wp_delete_post( $acf_group->ID, true);
}
// Find local JSON directory
$dir = new DirectoryIterator( dirname(__FILE__) . '/fields' );
foreach( $dir as $file ) {
if ( !$file->isDot() && 'json' == $file->getExtension() ) {
$json = json_decode( file_get_contents( $file->getPathname() ), true );
// What follows is basically a copy of import() in ACF admin/settings-export.php
// if importing an auto-json, wrap field group in array
if( isset($json['key']) ) {
$json = array( $json );
}
// vars
$added = array();
$ignored = array();
$ref = array();
$order = array();
foreach( $json as $field_group ) {
// remove fields
$fields = acf_extract_var($field_group, 'fields');
// format fields
$fields = acf_prepare_fields_for_import( $fields );
// save field group
$field_group = acf_update_field_group( $field_group );
// add to ref
$ref[ $field_group['key'] ] = $field_group['ID'];
// add to order
$order[ $field_group['ID'] ] = 0;
// add fields
foreach( $fields as $field ) {
// add parent
if( empty($field['parent']) ) {
$field['parent'] = $field_group['ID'];
} elseif( isset($ref[ $field['parent'] ]) ) {
$field['parent'] = $ref[ $field['parent'] ];
}
// add field menu_order
if( !isset($order[ $field['parent'] ]) ) {
$order[ $field['parent'] ] = 0;
}
$field['menu_order'] = $order[ $field['parent'] ];
$order[ $field['parent'] ]++;
// save field
$field = acf_update_field( $field );
}
}
}
}
}
function lc_import_json_save_no_point( $paths) {
return null;
}
@thomascharbit
Copy link
Author

Avoid using this gist , here is the plugin version : https://github.com/FreshFlesh/ACF-Sync

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment