WordPress Version: 6.2
/**
* Moves a directory from one location to another.
*
* Recursively invalidates OPcache on success.
*
* If the renaming failed, falls back to copy_dir().
*
* Assumes that WP_Filesystem() has already been called and setup.
*
* This function is not designed to merge directories, copy_dir() should be used instead.
*
* @since 6.2.0
*
* @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
*
* @param string $from Source directory.
* @param string $to Destination directory.
* @param bool $overwrite Optional. Whether to overwrite the destination directory if it exists.
* Default false.
* @return true|WP_Error True on success, WP_Error on failure.
*/
function move_dir($from, $to, $overwrite = false)
{
global $wp_filesystem;
if (trailingslashit(strtolower($from)) === trailingslashit(strtolower($to))) {
return new WP_Error('source_destination_same_move_dir', __('The source and destination are the same.'));
}
if ($wp_filesystem->exists($to)) {
if (!$overwrite) {
return new WP_Error('destination_already_exists_move_dir', __('The destination folder already exists.'), $to);
} elseif (!$wp_filesystem->delete($to, true)) {
// Can't overwrite if the destination couldn't be deleted.
return new WP_Error('destination_not_deleted_move_dir', __('The destination directory already exists and could not be removed.'));
}
}
if ($wp_filesystem->move($from, $to)) {
/*
* When using an environment with shared folders,
* there is a delay in updating the filesystem's cache.
*
* This is a known issue in environments with a VirtualBox provider.
*
* A 200ms delay gives time for the filesystem to update its cache,
* prevents "Operation not permitted", and "No such file or directory" warnings.
*
* This delay is used in other projects, including Composer.
* @link https://github.com/composer/composer/blob/2.5.1/src/Composer/Util/Platform.php#L228-L233
*/
usleep(200000);
wp_opcache_invalidate_directory($to);
return true;
}
// Fall back to a recursive copy.
if (!$wp_filesystem->is_dir($to)) {
if (!$wp_filesystem->mkdir($to, FS_CHMOD_DIR)) {
return new WP_Error('mkdir_failed_move_dir', __('Could not create directory.'), $to);
}
}
$result = copy_dir($from, $to, array(basename($to)));
// Clear the source directory.
if (true === $result) {
$wp_filesystem->delete($from, true);
}
return $result;
}