Ok so just to update that I figured a way a to do it, without deactivating the feature in the code.
Of course this will only remain until the next time that the post is saved. It’s more for debugging purposes.
1) Create a true/false acf field called “Revert single meta”
2) hook onto acf/save_post at priority 1000 (important), and manually revert each meta through update_post_meta, and not update_field (the latter will mess with repeater fields);
function my_custom_acf_process(){
//FIELDID is the corresponding FIELDID of the "Revert single meta" ACF field
if (isset($_POST['acf']['field_FIELDID'])&& $_POST['acf']['field_FIELDID']==1){
$_POST['acf']['field_FIELDID']=0;//Revert the true/false field;
if (acf_is_filter_enabled('acfe/single_meta')) {//Make sure plugin and feature are active
acf_disable_filter('acfe/single_meta');//Disable the filter
acfe_revert_single_meta($_POST['post_ID']);//Launch the reversal
}
}
}
add_action('acf/save_post', 'my_custom_acf_process',1000);
function acfe_revert_single_meta($postID){
if (!acf_is_filter_enabled('acfe/single_meta')) {
$acfeData = get_post_meta($postID, 'acf', true);
foreach ($acfeData as $acfKey => $acfValue) {
update_post_meta($postID,$acfKey, $acfValue);
}
delete_post_meta($postID, 'acf');
}else{
die('acfe filter still active');
}
}
Final update.
So it turned out that everything was working from the beginning.
The issue lays in the lack of documentation on this feature.
After wasting an entire day trying to figure what was not working.
I finally noticed that, in dev mode, there is an additional button that gets added in the sidebar, button that is called “Delete orphaned data” and that we’re actually supposed to click on it.
This button and the fact that we need to click on it is NOWHERE mentioned in your documentation.
It takes absolute luck to notice it, or hours digging in the pluging code to try to figure out why data gets merged, but not deleted. Database offloading is kind of the entire point of this feature, and it’s super weird that you don’t mention anywhere that we’re supposed to click that button.
Also to mention somewhere in your documentation: it’s not because a field is set to “save as single meta” that it will not get merged into the “acf” field.
I also thought the plugin was not working as expected, because it was still merging data I specifically said I wanted to keep as single meta. Not a big deal to merge it, but it should also be mentioned in your doc that this is the expected behavior. Sure it will potentially save other people lots of wasted time.
That said, great work on the plugin!
Hello,
Thanks for the feedback!
I just tested it, and the revert-back to individual meta works as expected. Note that as explained in the documentation, it is advised to enable the Developer Mode in order to check how data are saved in the database. As described, to revert-back:
Keep the feature enabled, get in the post administration you want to revert back. Disable the feature in your code, and save the post. All data will be saved back to individual meta data.
Here is a video showing this process. Note that this process works because when a user click on the “Update” button, a new request is sent to the server which load again all the code, including all WP/ACF hooks, and thus, check again the if the Single Meta feature is enabled.
Regarding your third post about the “Delete Orphan Meta” button: It is quite different from your original topic, since it’s not about reverting back to individual meta, but rather cleanup native individual meta when the Single Meta feature is enabled. Maybe you thought it wasn’t working because individual meta were still saved in the database.
In fact, ACF Extended doesn’t take the risk to automatically delete post/user/options meta when the user doesn’t explicitly ask for it, because these data are crucial. That’s why native individual meta have to be cleanup manually (using the Developer Mode or PhpMyAdmin) or using the “Clean Orphan Meta” button.
It’s also normal that fields using the “Save as individual meta” setting are still compressed into the Single Meta in order to keep a consistent data structure for complex fields with sub fields such as repeaters, clones etc…
I’ll try to enhance the documentation of that feature to avoid confusion.
Hope it’s now more clear!
Have a nice day!
Regards.