Skip to content

Instantly share code, notes, and snippets.

@hirasso
Last active April 17, 2024 15:09
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save hirasso/c48c04def92f839f6264349a1be773b3 to your computer and use it in GitHub Desktop.
Save hirasso/c48c04def92f839f6264349a1be773b3 to your computer and use it in GitHub Desktop.
A WordPress Plugin that allows to sync ACF field groups via WP CLI
<?php
/*
* Plugin Name: ACFSyncFieldGroups
* Plugin URI: https://gist.github.com/hirasso/c48c04def92f839f6264349a1be773b3
* Description: Allows to sync ACF field groups via WP CLI
* Version: 0.0.2
* Author: Rasso Hilber
* Author URI: https://rassohilber.com/
* License: GPL2+
* License URI: https://www.gnu.org/licenses/gpl-2.0.txt
* Requires PHP: 8.0
*/
if (!defined('ABSPATH')) exit; // Exit if accessed directly
/**
* Adds a wp cli command to sync all ACF field groups. Use it like this:
*
* "wp rhau acf-sync-field-groups"
*
*/
class ACFSyncFieldGroups
{
/**
* Init
*/
public static function init()
{
add_action('acf/init', [__CLASS__, 'add_wp_cli_command']);
}
/**
* Conditional to check if inside WP_CLI
*
* @return boolean
*/
private static function is_wp_cli(): bool
{
return defined('WP_CLI') && WP_CLI;
}
/**
* Add the WP_CLI command
*
* @return void
*/
public static function add_wp_cli_command(): void
{
if (self::is_wp_cli()) {
\WP_CLI::add_command('rhau acf-sync-field-groups', [__CLASS__, 'wp_cli_acf_sync_field_groups']);
}
}
/**
* Syncs all ACF field groups
*
* ## OPTIONS
*
* @param array $args
* @param array $assoc_args
* @return void
*/
public static function wp_cli_acf_sync_field_groups(array $args = [], array $assoc_args = []): void
{
// Only allow this if invoked from WP CLI
if (!self::is_wp_cli()) return;
acf_include('includes/admin/admin-internal-post-type-list.php');
if (!class_exists('ACF_Admin_Internal_Post_Type_List')) {
\WP_CLI::error('Some required ACF classes could not be found. Please update ACF to the latest version.');
}
acf_include('includes/admin/post-types/admin-field-groups.php');
/**
* @var \ACF_Admin_Field_Groups $field_groups_class
*/
$field_groups_class = acf_get_instance('ACF_Admin_Field_Groups');
$field_groups_class->setup_sync();
// Disable "Local JSON" controller to prevent the .json file from being modified during import.
acf_update_setting('json', false);
// Sync field groups and generate array of new IDs.
$files = acf_get_local_json_files();
foreach ($field_groups_class->sync as $key => $field_group) {
$local_field_group = json_decode(file_get_contents($files[$key]), true);
$local_field_group['ID'] = $field_group['ID'];
$imported_field_group = acf_import_field_group($local_field_group);
\WP_CLI::success("Synced ACF field group: {$imported_field_group["title"]}");
}
}
}
/**
* Initialize the plugin
*/
ACFSyncFieldGroups::init();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment