WP_MKDIR_P() │ WP 2.0.1
Функция wp_mkdir_p()
позволяет создавать директории (папки) в WordPress. Она поддерживает рекурсивное создание, то есть может создавать несколько вложенных папок сразу. Например, если вам нужно создать папку a/really/deep/sub/directory
, функция создаст все папки по пути, если они еще не существуют.
Как работает функция
При создании папок функция пытается установить соответствующие разрешения на созданные директории. Это означает, что на новые папки будут применены такие же права доступа, как и у родительской папки.
Время выполнения функции:
- 1 раз — 0.0002389 сек (быстро)
- 50000 раз — 0.16 сек (очень быстро)
Поддерживаемые версии:
- PHP: 7.3.3
- WordPress: 5.2.3
Возвращаемое значение
Функция возвращает true
или false
, в зависимости от того, успешно ли была создана директория. Она возвращает true
, если директория уже существует.
Использование функции
Чтобы использовать wp_mkdir_p()
, вам нужно передать ей полный путь к папке, которую вы хотите создать. Пример:
wp_mkdir_p( $target );
- $target (строка, обязательный параметр): Полный путь, по которому вы хотите создать директорию.
Примеры использования
Пример 1: Создание вложенных директорий
if ( wp_mkdir_p( 'a/really/deep/sub/directory' ) ) {
echo 'Директория создана!';
}
Этот код создает вложенную структуру папок. Если папка успешно создана, будет выведено сообщение "Директория создана!".
Пример 2: Создание папки в /uploads
Ниже представлен пример, как создать новую папку в директории /uploads
при активации плагина:
function myplugin_activate() {
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'] . '/mypluginfiles';
if ( ! wp_mkdir_p( $upload_dir ) ) {
echo "Не удалось создать директорию mypluginfiles";
}
}
register_activation_hook( __FILE__, 'myplugin_activate' );
В этом примере, когда плагин активируется, создается новая папка для файлов плагина.
Изменение кода функции
Вот как выглядит реализация функции wp_mkdir_p()
в WordPress:
function wp_mkdir_p( $target ) {
$wrapper = null;
// Удаляем протокол.
if ( wp_is_stream( $target ) ) {
list( $wrapper, $target ) = explode( '://', $target, 2 );
}
// Убираем двойные слеши.
$target = str_replace( '//', '/', $target );
// Восстанавливаем протокол, если он был.
if ( null !== $wrapper ) {
$target = $wrapper . '://' . $target;
}
// Убираем слеш в конце, если он есть.
$target = rtrim( $target, '/' );
if ( empty( $target ) ) {
$target = '/';
}
if ( file_exists( $target ) ) {
return @is_dir( $target );
}
// Проверяем на уязвимости.
if ( str_contains( $target, '../' ) || str_contains( $target, '..' . DIRECTORY_SEPARATOR ) ) {
return false;
}
// Ищем существующую родительскую папку и наследуем у нее права доступа.
$target_parent = dirname( $target );
while ( '.' !== $target_parent && ! is_dir( $target_parent ) && dirname( $target_parent ) !== $target_parent ) {
$target_parent = dirname( $target_parent );
}
// Получаем права доступа.
$stat = @stat( $target_parent );
if ( $stat ) {
$dir_perms = $stat['mode'] & 0007777;
} else {
$dir_perms = 0777;
}
if ( @mkdir( $target, $dir_perms, true ) ) {
// Если у нас есть umask, устанавливаем права доступа снова.
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;
}
Заключение
Функция wp_mkdir_p()
является полезным инструментом для разработчиков WordPress, позволяющим легко создавать директории и управлять правами доступа к ним. Вы можете использовать её в плагинах или темах для организации хранилища файлов.