Есть много информации о том как сделать экспорт медиафайлов в zip архив на wordpress. Есть куча готовых плагинов, которые будут работать, и решать большую часть поставленных задач. Но когда стоит нетривиальная задача, то нужно либо допиливать что то готовое, либо сделать свое.
Допустим у вас есть сайт на wordpress, и пользователи вашего сайта имеют возможность загрузить файл/документ в свой личный кабинет. Может быть как изображение, так и doc, docx, в общем все что не запрещено системой безопасности, или вами лично. Реализация загрузки медиафайлов выполнена с помощью ACF. Файлы загружаются в папку uploads без разделения на месяца/годы и тд. И вам нужно эти файлы/документы скачать с сайта в виде архива. Имя каждого файла соответствует имени того кто его загрузил.
Итак, код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | <?php if (isset($_GET['archivemedia'])) { // archivemedia - get- запрос, по которому будет срабатывать функция if (current_user_can('manage_options')) { // проверяем, является ли пользватель администратором add_action('init', function () { // Выбираем пользователей $args1 = array( 'role' => 'subscriber', 'order' => 'ASC', 'orderby' => 'display_name', 'fields' => 'all', ); $blogusers = get_users($args1); $path = 'uploads'; $file_folder = '/home/yourdomain.com/wp-content/uploads/'; // тут нужно указать полный путь к папке с файлами, $zip = new ZipArchive(); //подключаем библиотеку, в большинстве хостингов она поддерживается. $time = time(); $zipArchive = $file_folder . $time . ".zip"; $zip_name = $file_folder . $time . ".zip"; $zipOutputName = $time . ".zip"; if ($zip->open($zip_name, ZIPARCHIVE::CREATE) === TRUE) { foreach ($blogusers as $user) { $meta = get_user_meta($user->ID); $id_image = (isset($meta['personal_user_upload_doc'][0]) && $meta['personal_user_upload_doc'][0] != '') ? $meta['personal_user_upload_doc'][0] : ''; //получаем данные файла $user_name = (isset($meta['personal_user_name'][0]) && $meta['personal_user_name'][0] != '') ? $meta['personal_user_name'][0] : ''; // получаем имя пользователя if ($id_image && !isset($id_image['error'])) { $parsed = parse_url(wp_get_attachment_url($id_image)); $url = rawurlencode(basename($parsed['path'])); $url_with_base = 'wp-content/uploads/' . $url; $pos = preg_replace("/.*?\./", '', $url); $fn = $pos; $filename = 'Doc_' . $user_name . '.' . $fn; //тут мы переименовываем файл присвоив ему имя пользователя $zip->addFile($url_with_base, $filename); } } $zip->close(); if (file_exists($zipArchive)) { header('Content-type: application/zip'); header('Content-Disposition: attachment; filename="' . $zipOutputName . '"'); readfile($zip_name); unlink($zip_name); } else { $error .= "* Files not found"; } } else { echo 'failed'; } }); } } |
В результате выполнения этого кода, должен скачаться архив с файлами.