move_dir

The timeline below displays how wordpress function move_dir has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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;
}