Skip to content

Commit f649002

Browse files
authored
Merge pull request #13 from wpmetabox/fix/prefix-export-import-cycle
2 parents c07a1ac + 6b29ec4 commit f649002

File tree

2 files changed

+73
-3
lines changed

2 files changed

+73
-3
lines changed

src/Prefixer.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
namespace MBBParser;
3+
4+
class Prefixer {
5+
public static function add( array &$fields, string $prefix ): void {
6+
if ( ! $prefix ) {
7+
return;
8+
}
9+
foreach ( $fields as &$field ) {
10+
if ( ! empty( $field['id'] ) && ! str_starts_with( $field['id'], $prefix ) ) {
11+
$field['id'] = $prefix . $field['id'];
12+
}
13+
if ( ! empty( $field['fields'] ) && is_array( $field['fields'] ) ) {
14+
self::add( $field['fields'], $prefix );
15+
}
16+
}
17+
}
18+
19+
public static function remove( array &$fields, string $prefix ): void {
20+
if ( ! $prefix ) {
21+
return;
22+
}
23+
foreach ( $fields as &$field ) {
24+
if ( ! empty( $field['id'] ) && str_starts_with( $field['id'], $prefix ) ) {
25+
$field['id'] = substr( $field['id'], strlen( $prefix ) );
26+
}
27+
if ( isset( $field['fields'] ) && is_array( $field['fields'] ) ) {
28+
self::remove( $field['fields'], $prefix );
29+
}
30+
}
31+
}
32+
}

src/Unparsers/MetaBox.php

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?php
22
namespace MBBParser\Unparsers;
33

4+
use MBBParser\Prefixer;
5+
46
/**
57
* This class is the inverse of the parser.
68
* We convert the parsed data back to the format that can be saved to the database.
@@ -90,6 +92,11 @@ public function to_minimal_format() {
9092
unset( $settings[ $key ] );
9193
}
9294

95+
// Strip prefix from field IDs before exporting to JSON (minimal format)
96+
if ( ! empty( $settings['fields'] ) && is_array( $settings['fields'] ) ) {
97+
Prefixer::remove( $settings['fields'], $settings['prefix'] ?? '' );
98+
}
99+
93100
ksort( $settings );
94101

95102
return $settings;
@@ -255,22 +262,53 @@ public function unparse_modified() {
255262
return $this;
256263
}
257264

258-
public function unparse_meta_box() {
265+
/**
266+
* Unparse the meta box.
267+
*
268+
* For fields:
269+
* - Always keep it as a numeric array.
270+
* - Remove prefix from field IDs for the settings, that can be used for export, builder, local JSON.
271+
* - Add prefix to field IDs for parsed meta box, that's ready for registering.
272+
*/
273+
public function unparse_meta_box(): static {
259274
// If not meta box, return
260275
if ( $this->detect_post_type() !== 'meta-box' ) {
261276
return $this;
262277
}
263278

279+
$prefix = $this->lookup( [ 'prefix', 'settings.prefix' ], '' );
280+
281+
// If meta box is already parsed, normalize the fields array.
264282
if ( isset( $this->meta_box ) && is_array( $this->meta_box ) ) {
265283
// Fix: error on earlier versions that saved fields as object
266-
$fields = array_values( $this->meta_box['fields'] ?? [] );
284+
$fields = $this->meta_box['fields'] ?? [];
285+
$fields = array_values( $fields );
286+
287+
// Remove prefix from field IDs for the settings, that can be used for export, builder, local JSON.
288+
Prefixer::remove( $fields, $prefix );
289+
$this->fields = $fields;
290+
291+
// Add prefix to field IDs for parsed meta box, that's ready for registering.
292+
Prefixer::add( $fields, $prefix );
267293
$this->settings['meta_box']['fields'] = $fields;
268294

269295
return $this;
270296
}
271297

298+
// If meta box is not parsed, normalize the fields array.
299+
$fields = $this->fields ?: [];
300+
$fields = array_values( $fields );
301+
302+
// Remove prefix from field IDs for the settings, that can be used for export, builder, local JSON.
303+
Prefixer::remove( $fields, $prefix );
304+
$this->fields = $fields;
305+
272306
$meta_box = $this->get_settings();
273307

308+
// Add prefix to field IDs for parsed meta box, that's ready for registering.
309+
Prefixer::add( $fields, $prefix );
310+
$meta_box['fields'] = $fields;
311+
274312
foreach ( $this->get_unneeded_keys() as $key ) {
275313
unset( $meta_box[ $key ] );
276314
}
@@ -312,7 +350,7 @@ private function unparse_settings_page_tabs(): self {
312350

313351
$tab_items = [];
314352
foreach ( $tabs as $key => $value ) {
315-
$id = uniqid( 'tab_' );
353+
$id = uniqid( 'tab_' );
316354
$tab_items[ $id ] = compact( 'id', 'key', 'value' );
317355
}
318356

0 commit comments

Comments
 (0)