# Функция COPY_DIR() │ WP 2.5.0
Функция COPY_DIR()
копирует директорию из одного места в другое с помощью файловой абстракции WordPress.
## Предварительные условия
Перед использованием этой функции необходимо вызвать WP_Filesystem()
, чтобы настроить файловую систему.
Работа функции основана на API файловой системы, который создается на основе базового класса WP_Filesystem_Base
. Этот основной класс может быть расширен другими классами в зависимости от сервера, на котором работает ваш сайт. Результирующий объект сохранен в глобальной переменной $wp_filesystem
.
Чтобы узнать список возможных методов для $wp_filesystem
, ознакомьтесь с классами:
- WP_Filesystem_Base
- WP_Filesystem_Direct
- WP_Filesystem_FTPext
- WP_Filesystem_ftpsocket
- WP_Filesystem_SSH2
## Возвращаемое значение
Функция возвращает true
, если операция успешна, или объект WP_Error
, если произошла ошибка.
```php
true|WP_Error
Как использовать
Чтобы использовать COPY_DIR()
, вызовите функцию следующим образом:
copy_dir( $from, $to, $skip_list );
Параметры:
$from
(строка, обязательный) — директория-источник.$to
(строка, обязательный) — директория назначения.$skip_list
(массив строк) — массив файлов/папок, которые нужно пропустить при копировании. По умолчанию:array()
.
Примеры использования
1. Копирование директории
Копирует директорию avatars
из папки uploads
в её подкаталог с номером текущего месяца.
global $wp_filesystem;
$dir = wp_get_upload_dir();
/*
Array(
[path] => /home/user/html/wp-content/uploads/2018/05
[url] => //example.com/wp-content/uploads/2018/05
[subdir] => /2018/05
[basedir] => /home/user/html/wp-content/uploads
[baseurl] => https://example.com/wp-content/uploads
)
*/
$from = $dir['basedir'] . '/avatars';
$to = $wp_filesystem->find_folder($dir['path']);
copy_dir($from, $to);
2. Пропуск некоторых файлов
Этот пример также копирует директорию avatars
, но пропускает файлы index.php
и index.html
.
global $wp_filesystem;
$dir = wp_get_upload_dir();
$from = $dir['basedir'] . '/avatars';
$to = $wp_filesystem->find_folder($dir['path']);
$skip_list = array('index.php', 'index.html');
copy_dir($from, $to, $skip_list);
Примечания
- Глобальная переменная.
WP_Filesystem_Base
хранится в$wp_filesystem
, что соответствует классу файловой системы WordPress.
Изменения
С момента версии 2.5.0 функция была добавлена для использования.
Исходный код функции
Вот как выглядит код функции COPY_DIR()
в WordPress версии 6.7.2:
function copy_dir($from, $to, $skip_list = array()) {
global $wp_filesystem;
$dirlist = $wp_filesystem->dirlist($from);
if (false === $dirlist) {
return new WP_Error('dirlist_failed_copy_dir', __('Не удалось получить список директорий.'), basename($from));
}
$from = trailingslashit($from);
$to = trailingslashit($to);
if (!$wp_filesystem->exists($to) && !$wp_filesystem->mkdir($to)) {
return new WP_Error(
'mkdir_destination_failed_copy_dir',
__('Не удалось создать директорию назначения.'),
basename($to)
);
}
foreach ((array) $dirlist as $filename => $fileinfo) {
if (in_array($filename, $skip_list, true)) {
continue;
}
if ('f' === $fileinfo['type']) {
if (!$wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE)) {
// Если копирование не удалось, устанавливаем права файла и пробуем снова.
$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', __('Не удалось скопировать файл.'), $to . $filename);
}
}
wp_opcache_invalidate($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', __('Не удалось создать директорию.'), $to . $filename);
}
}
// Создаем $sub_skip_list для подкаталога как подмножество существующего $skip_list.
$sub_skip_list = array();
foreach ($skip_list as $skip_item) {
if (str_starts_with($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;
}
Похожие функции
Здесь представлены несколько функций, связанных с файловой системой:
get_dirsize()
— получение размера директории.list_files()
— получение списка файлов в директории.recurse_dirsize()
— рекурсивное получение размера директории.unzip_file()
— распаковка файла.wp_delete_file()
— удаление файла.wp_delete_file_from_directory()
— удаление файла из директории.WP_Filesystem()
— основные функции работы с файловой системой.
Эти функции помогут вам более эффективно управлять файлами и директориями в WordPress.