Как использовать функцию COPY_DIR() в WordPress 2.5.0

# Функция 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.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *