Skip to content

Commit 680b985

Browse files
committed
fix nested serialized array (related to export-import issue of widget roles & admin page's roles)
1 parent 9ce5b33 commit 680b985

File tree

2 files changed

+40
-17
lines changed

2 files changed

+40
-17
lines changed

helpers/class-array-helper.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,32 @@ public function find_assoc_array_index_by_value( $array, $key, $value ) {
3636

3737
return false;
3838
}
39+
40+
/**
41+
* Clean a serialized array from nested-serialized.
42+
*
43+
* The returned $value after unserialized should be an array.
44+
* If it's still a string, then we need to unserialize it.
45+
* This was related to roles issue on export / import.
46+
*
47+
* @param string $value The value to clean.
48+
* @param int $depth The depth of the checking.
49+
*
50+
* @return array The unserialized array.
51+
*/
52+
public function clean_unserialize( $value, $depth = 2 ) {
53+
for ( $i = 0; $i < $depth; $i++ ) {
54+
if ( is_serialized( $value ) ) {
55+
$value = unserialize( $value );
56+
57+
if ( ! is_serialized( $value ) ) {
58+
break;
59+
}
60+
} else {
61+
break;
62+
}
63+
}
64+
65+
return $value;
66+
}
3967
}

modules/tool/inc/process-import.php

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77

88
defined( 'ABSPATH' ) || die( "Can't access directly" );
99

10+
use Udb\Helpers\Array_Helper;
11+
1012
return function () {
1113

12-
$import_file = $_FILES['udb_import_file'];
13-
$file_name = basename( sanitize_file_name( wp_unslash( $import_file['name'] ) ) );
14-
$explodes = explode( '.', $file_name );
15-
$ext = end( $explodes );
14+
$array_helper = new Array_Helper();
15+
$import_file = $_FILES['udb_import_file'];
16+
$file_name = basename( sanitize_file_name( wp_unslash( $import_file['name'] ) ) );
17+
$explodes = explode( '.', $file_name );
18+
$ext = end( $explodes );
1619

1720
// wp_check_filetype fails here, so let's check it manually.
1821
if ( 'json' !== $ext ) {
@@ -119,19 +122,7 @@
119122

120123
foreach ( $meta as $meta_key => $meta_value ) {
121124
if ( false !== stripos( $meta_key, '_roles' ) || false !== stripos( $meta_key, '_users' ) ) {
122-
if ( is_serialized( $meta_value ) ) {
123-
$unserialized_meta_value = unserialize( $meta_value );
124-
125-
/**
126-
* The value of $meta_value after serialized should be an array.
127-
* If it's still a string, then we need to unserialize it.
128-
*
129-
* This was related to widget roles issue on export / import.
130-
*/
131-
if ( is_string( $unserialized_meta_value ) ) {
132-
$meta_value = $unserialized_meta_value;
133-
}
134-
}
125+
$meta_value = $array_helper->clean_unserialize( $meta_value, 3 );
135126
}
136127

137128
update_post_meta( $post_id, $meta_key, $meta_value );
@@ -168,6 +159,10 @@
168159
}
169160

170161
foreach ( $meta as $meta_key => $meta_value ) {
162+
if ( false !== stripos( $meta_key, '_roles' ) || false !== stripos( $meta_key, '_users' ) ) {
163+
$meta_value = $array_helper->clean_unserialize( $meta_value, 3 );
164+
}
165+
171166
update_post_meta( $post_id, $meta_key, $meta_value );
172167
}
173168
}

0 commit comments

Comments
 (0)