wp_mkdir_p() WP 2.0.1

Рекурсивно створює директорію (папку) вказаним шляхом. Нічого не робить, якщо папка вже є. Надає права батьків новим папкам.

Це обгортка для базової функції php mkdir() .

  • Функція очищає переданий шлях, прибираючи у ньому можливе подвійні слеши // .
  • Зберігає протокол, наприклад file://.
  • Створювані папки успадковують права батьків.
  • Шлях не може містити ../– у цьому випадку каталог не буде створений.
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.0.2

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

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

	// Від 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 під 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 ( false !== strpos( $target, '../' ) || false !== strpos( $target, '..' . DIRECTORY_SEPARATOR ) ) {
		return false;
	}

	// Ви потребуєте усвідомити, що 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 ) ) {

		/*
		 * Якщо umask is set that modifies $dir_perms, ми повинні 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *