To combine the fixes from both threads, I replaced:
// Add field menu_order.
if( !isset($count[ $field['parent'] ]) ) {
$count[ $field['parent'] ] = 1;
} else {
$count[ $field['parent'] ]++;
}
// Only add menu order if doesn't already exist.
// Allows Flexible Content field to set custom order.
if( !isset($field['menu_order']) ) {
$field['menu_order'] = ($count[ $field['parent'] ] - 1);
}
on lines 1029-1040 of acf-field-group-functions.php with
// Add field menu_order.
if (!isset($field['parent_layout'])) {
if( !isset($count[ $field['parent'] ]) ) {
$count[ $field['parent'] ] = 1;
} else {
$count[ $field['parent'] ]++;
}
} else {
if( !isset($count[ $field['parent_layout'] ]) ) {
$count[ $field['parent_layout'] ] = 1;
} else {
$count[ $field['parent_layout'] ]++;
}
}
// Only add menu order if doesn't already exist.
// Allows Flexible Content field to set custom order
if (!isset($field['parent_layout'])) {
if( empty($field['menu_order']) && $field['menu_order'] !== 0) {
$field['menu_order'] = ($count[ $field['parent'] ] - 1);
}
} else {
if( empty($field['menu_order']) && $field['menu_order'] !== 0) {
$field['menu_order'] = ($count[ $field['parent_layout'] ] - 1);
}
}
It looks like this is fixed in 5.8.5, as per patch notes at https://www.advancedcustomfields.com/blog/acf-5-8-5-release/
*Release Date - 8 October 2019*
* New - Added new choice "Add" to the User Form location rule.
* New - Optimized acf_form() logic when used in combination with acf_register_form().
* Fix - Fixed bug causing incorrect field order after sync.
* Fix - Fixed bug reverting the first field type to Text in Firefox version 69.0.1.
* Fix - Fixed bug causing tinymce issues when changing between block modes.
* Fix - Fixed bug preventing block registration when category does not exist.
* Fix - Fixed bug preventing block registration when no icon is declared.
* Dev - Added RegExp compatibility for innerBlocks.
I am currently downloading to verify.
The fix in 5.8.5 looks good. Code change looks like the content of $field_gruop['ID']
and $field_gruop['menu_order']
were explicitly cast as INT to prevent issues with later comparisons.