Last active
September 18, 2024 05:24
-
-
Save ollietreend/df32c5cbe2914f6fc407332bf6cbfca5 to your computer and use it in GitHub Desktop.
Convert Advanced Custom Fields Pro configuration from PHP to JSON.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Plugin Name: Convert ACF PHP to JSON | |
* Description: Convert Advanced Custom Fields Pro configuration from PHP to JSON. | |
*/ | |
namespace ConvertAcfPhpToJson; | |
/** | |
* Add submenu item under 'Custom Fields' | |
*/ | |
function admin_menu() { | |
add_submenu_page('edit.php?post_type=acf-field-group', 'Convert PHP fields to JSON', 'PHP to JSON', 'manage_options', 'acf-php-to-json', __NAMESPACE__ . '\\admin_page'); | |
} | |
add_action('admin_menu', __NAMESPACE__ . '\\admin_menu', 20); | |
/** | |
* Output the admin page | |
*/ | |
function admin_page() { | |
?> | |
<div class="wrap"> | |
<h1>Convert PHP fields to JSON</h1> | |
<?php | |
if (!isset($_GET['continue']) || $_GET['continue'] !== 'true') { | |
admin_page_intro(); | |
} | |
else { | |
admin_page_convert(); | |
} | |
?> | |
</div> | |
<?php | |
} | |
/** | |
* Output the introductory page | |
*/ | |
function admin_page_intro() { | |
$groups = get_groups_to_convert(); | |
if (empty($groups)) { | |
echo '<p>No PHP field group configuration found. Nothing to convert.</p>'; | |
return; | |
} | |
else { | |
echo sprintf('<p>%d field groups will be converted from PHP to JSON configuration.</p>', count($groups)); | |
echo '<a href="edit.php?post_type=acf-field-group&page=acf-php-to-json&continue=true" class="button button-primary">Convert Field Groups</a>'; | |
} | |
} | |
/** | |
* Convert the field groups and output the conversion page | |
*/ | |
function admin_page_convert() { | |
$groups = get_groups_to_convert(); | |
echo sprintf('<p>Converting %d field groups from PHP to JSON configuration...</p>', count($groups)); | |
echo '<ol>'; | |
foreach ($groups as $group) { | |
if (convert_group($group)) { | |
echo sprintf('<li>Converted: <strong>%s</strong> (%s)</li>', $group['title'], $group['key']); | |
} | |
else { | |
echo sprintf('<li><strong>Failed to convert: %s</strong> (%s)</li>', $group['title'], $group['key']); | |
} | |
} | |
echo '</ol>'; | |
echo '<p>Done. Now remove the PHP field group configuration.</p>'; | |
} | |
/** | |
* Get the PHP field groups which will be converted. | |
* | |
* @return array | |
*/ | |
function get_groups_to_convert() { | |
$groups = acf_get_local_field_groups(); | |
if (!$groups) return []; | |
return array_filter($groups, function($group) { | |
return $group['local'] == 'php'; | |
}); | |
} | |
/** | |
* Convert a field group to JSON | |
* | |
* @param array $group | |
* @return bool | |
*/ | |
function convert_group($group) { | |
$group['fields'] = acf_get_fields($group['key']); | |
return acf_write_json_field_group($group); | |
} |
Hi @bigheadzach
I haven't used WordPress for several years now, so am not best placed to help figure out why that's happened in your case. However, I wonder if it could be related to the issue AdvancedCustomFields/acf#266.
Within this plugin, the conversion from PHP to JSON happens in the convert_group
function:
function convert_group($group) {
$group['fields'] = acf_get_fields($group['key']);
return acf_write_json_field_group($group);
}
The functions acf_get_fields
and acf_write_json_field_group
are provided by ACF itself. This plugin essentially just acts as the glue between those two functions – but it doesn't perform any conversion logic of its own, as that's all handled by those ACF functions.
I hope that helps!
Thanks a lot!!
@ollietreend Thank you for this!
I'm getting failed to convert
error. I've check acf json and file permission already.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This seemed to work but it looks like it took clone fields and compressed them somehow - the exported PHP is different and results in a structure that causes all sorts of problems.
Before import:
After import and re-export:
Noting that the original PHP was written awhile back and possibly a few minor versions ago, so it's possible that the format has changed in the meantime - however the expectation is that the field machine names (by which I'm actually pulling the field values) shouldn't change, but they are and that breaks a lot of stuff. Anyone else having similar issues?
NOTE: Getting this error for each group that is imported:
This just seems to be a check-for-existing-fieldgroup-post that isn't properly null-coalesced, so not crucial to the issue above.