Здравствуйте! Мне нужно реализовать функционал, который позволяет хранить изображения или файлы загружаемые пользователями на другом хостинге(сервере). Процесс загрузки изображений проходит через стандартный загрузчик вордпресс. То есть нужно как то отловить событие загрузки изображения в загрузчике и с помощью ftp сохранять на другом сервере. При этом на сайте все должно правильно открываться, не смотря на то что изображения с другого сервера.
В интернете нашла такое:
Для того что бы изображения которые загружает загрузчик медиафайлов вордпресс сохранялись на другом сервере по FTP я использую следующий плагин.
Как его написать:
1. Создайте папку в каталоге «plugins» например «media-ftp-plugin»
2. Создайте .php файл назовите например «media-ftp-plugin.php»
3. Вставьте в него следующий код:
/* Plugin Name: Wp-ftp-media-library Plugin URI: http://onwp.ru/question/kak-sdelat-tak-chto-by-izobrazheniya-xranilis-na-drugom-servere Description: Let's you upload images to ftp-server and remove the upload on the local machine. Version: 0.1 Author: TrubinE Author URI: http://onwp.ru */ /** * @version 0.1 */ function wpse_74180_upload_to_ftp($args) { $upload_dir = wp_upload_dir(); $upload_url = get_option('upload_url_path'); $upload_yrm = get_option('uploads_use_yearmonth_folders'); /** * Change this to match your server * You only need to change the those with (*) * If marked with (-) its optional */ $settings = array( 'host' => 'home.newserver.ru', // * the ftp-server hostname 'port' => 21, // * the ftp-server port (of type int) 'user' => 'user', // * ftp-user 'pass' => 'pass', // * ftp-password 'cdn' => 'home.newserver.ru', // * This have to be a pointed domain or subdomain to the root of the uploads 'path' => '/www/img', // - ftp-path, default is root (/). Change here and add the dir on the ftp-server, 'base' => $upload_dir['basedir'] // Basedir on local ); /** * Change the upload url to the ftp-server */ if (empty($upload_url)) { update_option('upload_url_path', esc_url($settings['cdn'])); } /** * If uploads is stored like /uploads/year/month * Remove and use only /uploads/ */ if ($upload_yrm) { update_option('uploads_use_yearmonth_folders', ''); } /** * Host-connection * Read about it here: http://php.net/manual/en/function.ftp-connect.php */ $connection = ftp_connect($settings['host'], $settings['port']); /** * Login to ftp * Read about it here: http://php.net/manual/en/function.ftp-login.php */ $login = ftp_login($connection, $settings['user'], $settings['pass']); /** * Check ftp-connection */ if (!$connection || !$login) { die('Connection attempt failed, Check your settings'); } /** * Get all files in uploads - local * Remove hidden-files... mabye better solution * http://php.net/manual/en/function.scandir.php */ $files = preg_grep('/^([^.])/', scandir($settings['base'])); // Cycle through all source files foreach ($files as $file) { /** * If we ftp-upload successfully, mark it for deletion * http://php.net/manual/en/function.ftp-put.php */ if (is_file($settings['base'] . '/' . $file)) { if (ftp_put($connection, $settings['path'] . "/" . $file, $settings['base'] . "/" . $file, FTP_BINARY)) { $delete[] = $file; } } } // Delete all successfully-copied files foreach ($delete as $file) { if (is_file($settings['base'] . '/' . $file)) { unlink($settings['base'] . '/' . $file); } } return $args; } add_filter('wp_generate_attachment_metadata', 'wpse_74180_upload_to_ftp'); add_filter('pre_option_upload_url_path', 'wpse_77960_upload_url'); function wpse_77960_upload_url() { return 'http://newserver.ru/img'; } add_filter('wp_handle_upload_prefilter', 'custom_upload_filter'); function custom_upload_filter($file) { function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((int) $usec + (int) $sec); } $time = microtime_float(); $file['name'] = $time . $file['name']; return $file; }</code> 4. Настроить под свои данные. Вы должны найти код: <code>$settings = array( 'host' => 'home.newserver.ru', // * the ftp-server hostname 'port' => 21, // * the ftp-server port (of type int) 'user' => 'user', // * ftp-user 'pass' => 'pass', // * ftp-password 'cdn' => 'home.newserver.ru', // * This have to be a pointed domain or subdomain to the root of the uploads 'path' => '/www/img', // - ftp-path, default is root (/). Change here and add the dir on the ftp-server, 'base' => $upload_dir['basedir'] // Basedir on local );
И заменить данные на свои.
cdn — домен где будут храниться файлы
host — можно указать ip или домен подключения по фтп
path — путь(полный, от того момента как подключились) к папке где хранить изображения
port — порт подключения по ftp
user — имя пользователя для подключения по ftp
pass — пароль для подключения по ftp
base — можно не менять
5. Заменить адрес хранения картинок на новый(новый адрес и путь для хранения картинок в вордпресс).
Для этого найдите функцию
function wpse_77960_upload_url() { return 'http://newserver.ru/img'; }
Замените
— на новый, где у вас будут картинки.
Но почему-то не работает. Картинки не отображаются, а файлы не загружаются. То есть, показывает, что закачал, но на сервере папка пуста.
Если отключить функцию "Помещать загруженные мной файлы в папки по месяцу и году" то при загрузки ошибки не выдает, просто отображается изображение «битой» картинки.
Может есть кто работал или работает с этим плагином? Что нужно доработать? За любую помощь буду очень благодарна!
Дружаев Владимир (Otshelnik-Fm) сказал(а)
Я лишь намекнул - что первоисточник может вам помочь. Иногда люди не догадываются написать автору напрямую.
Это из моего опыта. Рад был вам помочь
Сам автор не знает в чем может быть причина.... должно работать))) вот Ответ!!!
Печально, но, к сожалению, данный плагин не поддерживается и что же делать..... Вот я и написала на форум так как знаю что здесь есть специалисты.
Владимир, спасибо вам за ответ!