base_prefix; foreach ( $work as $i => $t ) { // §9.4: the only exclusion — our own job/lock rows. if ( $base . 'options' === $t['name'] ) { $work[ $i ]['transform'] = array( 'col' => 'option_name', 'skip_prefix' => 'dbmg_', ); } elseif ( $base . 'sitemeta' === $t['name'] ) { $work[ $i ]['transform'] = array( 'col' => 'meta_key', 'skip_prefix' => 'dbmg_', ); } } if ( 'subsite' !== $scope['type'] ) { return $work; } $blog_id = (int) $scope['blog_id']; $prefix = Table_Catalog::blog_prefix( $blog_id ); $cap_key = $prefix . 'capabilities'; $members = $wpdb->prepare( 'SELECT dbmg_m.`user_id` FROM %i AS dbmg_m WHERE dbmg_m.`meta_key` = %s', $base . 'usermeta', $cap_key ); // The filter is stored in the job and runs in later requests, whose placeholder token differs: put any '%' back now. $members = $wpdb->remove_placeholder_escape( $members ); $convert = ! empty( $scope['convert_prefix'] ); foreach ( $work as $i => $t ) { if ( $scope['include_users'] && $base . 'users' === $t['name'] ) { $work[ $i ]['row_filter'] = '`ID` IN (' . $members . ')'; } elseif ( $scope['include_users'] && $base . 'usermeta' === $t['name'] ) { $work[ $i ]['row_filter'] = '`user_id` IN (' . $members . ')'; if ( $convert ) { $work[ $i ]['transform'] = array( 'col' => 'meta_key', 'rename' => array( $prefix . 'capabilities' => $base . 'capabilities', $prefix . 'user_level' => $base . 'user_level', ), // Other sites' roles would grant access that doesn't exist in a standalone install. 'drop_regex' => '/^' . preg_quote( $base, '/' ) . '(\d+_)?(capabilities|user_level)$/', ); } } elseif ( $convert && $prefix !== $base && 0 === strpos( $t['name'], $prefix ) ) { $work[ $i ]['rename_to'] = $base . substr( $t['name'], strlen( $prefix ) ); if ( $prefix . 'options' === $t['name'] ) { $work[ $i ]['transform'] = array( 'col' => 'option_name', 'rename' => array( $prefix . 'user_roles' => $base . 'user_roles' ), ); } } } return $work; } /** * Apply a row transform. Returns null when the row must be skipped. * * @param array $row Row. * @param array|null $transform Rule. * @return array|null */ public static function transform_row( array $row, $transform ) { if ( ! $transform ) { return $row; } $col = $transform['col']; if ( ! array_key_exists( $col, $row ) || null === $row[ $col ] ) { return $row; } $value = (string) $row[ $col ]; if ( ! empty( $transform['skip_prefix'] ) && 0 === strpos( $value, $transform['skip_prefix'] ) ) { return null; } if ( ! empty( $transform['rename'] ) && isset( $transform['rename'][ $value ] ) ) { $row[ $col ] = $transform['rename'][ $value ]; return $row; } if ( ! empty( $transform['drop_regex'] ) && preg_match( $transform['drop_regex'], $value ) ) { return null; } return $row; } }