wp_mkdir_p() WP 2.0.1
Рекурсивное создание директории (папки) по указанному пути. Задает права родителей создаваемым папкам.
Это обертка для базовой php функции mkdir(). Функция очищает переданный путь, убирая в нем возможное двойные слэши //. Сохраняет протокол. Создаваемые папки наследуют права родителей.
1 раз — 0.0002389 сек (быстро) | 50000 раз — 0.16 сек (очень быстро) | PHP 7.3.3, WP 5.2.3
Хуков нет.
Возвращает
true/false. Была ли создана указанная директория. true также будет возвращено, если папка уже существует.
Использование
wp_mkdir_p( $target );
- $target(строка) (обязательный)
- Полный путь до директории которую нужно создать.
Примеры
#1 Демонстрация работы функции
Предположим нам нужно создать директорию в каталоге uploads
if ( wp_mkdir_p('a/really/deep/sub/directory') ){
echo 'Каталог создан!';
}
#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' );
Список изменений
Код wp_mkdir_p() wp mkdir p
WP 5.6.2
<?php
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 ( false !== strpos( $target, '../' ) || false !== strpos( $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;
}
Cвязанные функции