copy_dir( string $from, string $to, array $skip_list = array() )

Copies a directory from one location to another via the WordPress Filesystem Abstraction.


Description Description

Assumes that WP_Filesystem() has already been called and setup.


Parameters Parameters

$from

(string) (Required) Source directory.

$to

(string) (Required) Destination directory.

$skip_list

(array) (Optional) A list of files/folders to skip copying.

Default value: array()


Top ↑

Return Return

(true|WP_Error) True on success, WP_Error on failure.


Top ↑

Source Source

File: wp-admin/includes/file.php

function copy_dir( $from, $to, $skip_list = array() ) {
	global $wp_filesystem;

	$dirlist = $wp_filesystem->dirlist( $from );

	$from = trailingslashit( $from );
	$to   = trailingslashit( $to );

	foreach ( (array) $dirlist as $filename => $fileinfo ) {
		if ( in_array( $filename, $skip_list ) ) {
			continue;
		}

		if ( 'f' == $fileinfo['type'] ) {
			if ( ! $wp_filesystem->copy( $from . $filename, $to . $filename, true, FS_CHMOD_FILE ) ) {
				// If copy failed, chmod file to 0644 and try again.
				$wp_filesystem->chmod( $to . $filename, FS_CHMOD_FILE );
				if ( ! $wp_filesystem->copy( $from . $filename, $to . $filename, true, FS_CHMOD_FILE ) ) {
					return new WP_Error( 'copy_failed_copy_dir', __( 'Could not copy file.' ), $to . $filename );
				}
			}
		} elseif ( 'd' == $fileinfo['type'] ) {
			if ( ! $wp_filesystem->is_dir( $to . $filename ) ) {
				if ( ! $wp_filesystem->mkdir( $to . $filename, FS_CHMOD_DIR ) ) {
					return new WP_Error( 'mkdir_failed_copy_dir', __( 'Could not create directory.' ), $to . $filename );
				}
			}

			// generate the $sub_skip_list for the subdirectory as a sub-set of the existing $skip_list
			$sub_skip_list = array();
			foreach ( $skip_list as $skip_item ) {
				if ( 0 === strpos( $skip_item, $filename . '/' ) ) {
					$sub_skip_list[] = preg_replace( '!^' . preg_quote( $filename, '!' ) . '/!i', '', $skip_item );
				}
			}

			$result = copy_dir( $from . $filename, $to . $filename, $sub_skip_list );
			if ( is_wp_error( $result ) ) {
				return $result;
			}
		}
	}
	return true;
}

Top ↑

Changelog Changelog

Changelog
Version Description
2.5.0 Introduced.


Top ↑

User Contributed Notes User Contributed Notes

  1. Skip to note 1 content
    Contributed by J.D. Grimes
    // Connecting to the filesystem.
    if ( ! WP_Filesystem() ) {
    	// Unable to connect to the filesystem, FTP credentials may be required or something.
    	// You can request these with request_filesystem_credentials()
    	exit;
    }
    
    // Don't forget that the target directory needs to exist.
    // If it doesn't already, you'll need to create it.
    global $wp_filesystem;
    $wp_filesystem->mkdir( $target_dir );
    
    // Now copy all the files in the source directory to the target directory.
    copy_dir( $src_dir, $target_dir );
    

You must log in before being able to contribute a note or feedback.