wp_mkdir_p()WP 2.0.1

Рекурсивно создает директорию (папку) по указанному пути. Ничего не делает если папка уже есть. Дает права родителей новым папкам.

Это обертка для базовой php функции mkdir().

  • Функция очищает переданный путь, убирая в нем возможное двойные слэши //.
  • Сохраняет протокол, например file://.
  • Создаваемые папки наследуют права родителей.
  • Путь не может содержать ../ - в этом случае каталог не будет создан.

Смотрите также: WP_Filesystem_Direct{}.

1 раз — 0.0002389 сек (быстро) | 50000 раз — 0.16 сек (очень быстро) | PHP 7.3.3, WP 5.2.3

Хуков нет.

Возвращает

true|false. Была ли создана указанная директория. true также будет возвращено, если папка уже существует.

Использование

wp_mkdir_p( $target );
$target(строка) (обязательный)
Полный путь до директории которую нужно создать.

Примеры

0

#1 Демонстрация работы функции

Предположим нам нужно создать директорию в каталоге uploads

if ( wp_mkdir_p('a/really/deep/sub/directory') ){
  echo 'Каталог создан!';
}
0

#2 Создание каталога внутри /uploads

Этот пример показывает как создать новую папку в каталоге /uploads, во время активации плагина. Может быть полезно, когда у плагина есть функции импорта файлов или возможность загружать файлы и вы хотите сохранять все файлы в определенную папку.

function myplugin_activate() {
	$upload = wp_upload_dir();
	$upload_dir = $upload['basedir'];
	$upload_dir = $upload_dir . '/mypluginfiles';

	if ( ! wp_mkdir_p( $upload_dir ) ){
		echo "Не удалось создать каталог mypluginfiles";
	}
}
register_activation_hook( __FILE__, 'myplugin_activate' );

Список изменений

С версии 2.0.1 Введена.

Код wp_mkdir_p() WP 6.5.2

function wp_mkdir_p( $target ) {
	$wrapper = null;

	// Strip the protocol.
	if ( wp_is_stream( $target ) ) {
		list( $wrapper, $target ) = explode( '://', $target, 2 );
	}

	// From php.net/mkdir user contributed notes.
	$target = str_replace( '//', '/', $target );

	// Put the wrapper back on the target.
	if ( null !== $wrapper ) {
		$target = $wrapper . '://' . $target;
	}

	/*
	 * Safe mode fails with a trailing slash under certain PHP versions.
	 * Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
	 */
	$target = rtrim( $target, '/' );
	if ( empty( $target ) ) {
		$target = '/';
	}

	if ( file_exists( $target ) ) {
		return @is_dir( $target );
	}

	// Do not allow path traversals.
	if ( str_contains( $target, '../' ) || str_contains( $target, '..' . DIRECTORY_SEPARATOR ) ) {
		return false;
	}

	// We need to find the permissions of the parent folder that exists and inherit that.
	$target_parent = dirname( $target );
	while ( '.' !== $target_parent && ! is_dir( $target_parent ) && dirname( $target_parent ) !== $target_parent ) {
		$target_parent = dirname( $target_parent );
	}

	// Get the permission bits.
	$stat = @stat( $target_parent );
	if ( $stat ) {
		$dir_perms = $stat['mode'] & 0007777;
	} else {
		$dir_perms = 0777;
	}

	if ( @mkdir( $target, $dir_perms, true ) ) {

		/*
		 * If a umask is set that modifies $dir_perms, we'll have to re-set
		 * the $dir_perms correctly with chmod()
		 */
		if ( ( $dir_perms & ~umask() ) !== $dir_perms ) {
			$folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );
			for ( $i = 1, $c = count( $folder_parts ); $i <= $c; $i++ ) {
				chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );
			}
		}

		return true;
	}

	return false;
}