Как сделать так что бы изображения хранились на другом сервере?

Мне нужно реализовать функционал, который позволяет хранить файлы(скрипты) вордпресс на одном хостинге, а изображения или файлы загружаемые пользователями на другом хостинге(сервере). Процесс загрузки изображений проходит через стандартный загрузчик вордпресс. То есть нужно как то отловить событие загрузки изображения в загрузчике и с помощью 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;
 }
 

4. Настроить под свои данные.
Вы должны найти код:

 $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';
 }
 

Замените http://download.golgofa.ru/img — на новый, где у вас будут картинки.

Добавить Комментарий

И нифига не работает! Выдает ошибку. Сами то пробовали? Перед тем как копи-паст с зарубежного источника сделать?

Здравствуйте, перед тем как выплескивать негативные эмоции — пробовали поправить ошибку? Пробовали разобраться? Почему не написали, какая именно ошибка? Нужно понимать, что у вас возможно другие настройки на сервере, другие права на доступы, возможно другой код которые мешает работе данного плагина.

На счет кода, тут вы полностью не правы. Этот пример из реальной задачи, которую доводилось в свое время реализовывать мне.

Что бы не быть пустословным, вот пример этого проекта: http://www.bmw*lan*d.ru/auto/boec — посмотрите куда ведут ссылки с картинок.(удалите 2 звездочки из ссылки)

в 30.10.2016.
Добавить Комментарий

Ваш плагин идеально подходит для нужд моего сайта, но он никак не хочет работать.

Сначала вышли каракули, но потом когда в файле php заключил весь код в тег php и уже без каракуль.

В целом код получился таким:

<?php
/*

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' => 'ТУТ IP САЙТА', // * the ftp-server hostname

'port' => 21, // * А ТУТ НЕ НАДО этот 21 в одинарные кавычки?

'user' => 'ЮЗЕР-ФТП', // * ftp-user

'pass' => 'ПАРОЛЬ-ФТП', // * ftp-password

'cdn' => 'img.domen.ru', // * This have to be a pointed domain or subdomain to the root of the uploads

'path' => '/var/www/domen.ru/data/www/img.domen.ru/wp-content/uploads', // - 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://img.domen.ru/wp-content/uploads';

}

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;

}
?>

 

Всё правильно ведь? Но почему-то не работает. Картинки не отображаются, а файлы не загружаются. То есть, показывает, что закачал, но на сервере папка пуста.

 

Будьте добры, помогите пожалуйста установить Ваш плагин!

 

Спасибо!

проверьте права на папки, куда загружаете.

Так же в консоле, когда загружаете картинку(если через загрузчик, то она загружается через ajax). Посмотрите какой ответ приходит, возможно там увидите ошибку, которая не дает загрузить файлы.

в 10.11.2016.

Права были следующими:

Папка: media-ftp-plugin — 755

Файл плагина: media-ftp-plugin.php — 644

 

На другом сервере созданы папки «wp-content» (755) и подкаталог «uploads» (777) — в последней наверное тоже должно быть 755? А то 777 говорят опасно ставить.

 

Кажется всё верно. Но не загружает. При загрузки ошибки не выдает, просто отображается изображение «битой» картинка. Можно ли к Вам обратиться за установкой плагина? Конечно же за денежное вознаграждение.

в 10.11.2016.

Вам нужно посмотреть:

«Так же в консоле, когда загружаете картинку(если через загрузчик, то она загружается через ajax). Посмотрите какой ответ приходит, возможно там увидите ошибку, которая не дает загрузить файлы.»

 

в 11.11.2016.
Добавить Комментарий

Появилась необходимость изменить имя файлового сервера. С files.xxxxx.ru на files.yyyyy.ru .
Простое переименование. Физически всё остаётся на тех же местах.
После внесения изменений в код будут ли подгружаться старые (ранее загруженные) картинки?
Какие могу возникнуть подводные камни?
Хочется быть готовым к переименованию, а не бегать потом с выпученными глазами))

Создайте резервную копию. Или создайте разработочную версию сайта.

И протестируйте))

Подводные камни в любом случае будут но их можно решить. Данное решение предложенное здесь — не просто скопировал вставил и все готово. Возможно нужно будет отладить.

Возникнут более конкретные вопросы — обращайтесь.

в 31.01.2017.
Добавить Комментарий

Вопрос, а как на сео будет влиять такое решение? Когда изображение хранится не на сервере сайта, а в другом месте

Думаю вряд ли Вам тут подскажут по сео. Сайт немного другой тематики.

в 07.02.2017.

ну мало ли))

в 07.02.2017.
Добавить Комментарий

У меня вот такая буга-вуга
Warning: Invalid argument supplied for foreach() in /var/www/vhosts/name.plsk.regruhosting.ru/site.ru/wp-content/plugins/media-ftp-plugin/media-ftp-plugin.php on line 79

Warning: Cannot modify header information — headers already sent by (output started at /var/www/vhosts/name.plsk.regruhosting.ru/site.ru/wp-content/plugins/media-ftp-plugin/media-ftp-plugin.php:79) in /var/www/vhosts/name.plsk.regruhosting.ru/site.ru/wp-includes/pluggable.php on line 1210

Это в загрузчике вылезает

Причину нашел. Теперь новая проблема «Не могу создать директорию images. Проверьте, доступна ли родительская директория для записи.» хотя через панель хостера папке «img.site.ru» — поставил 777

а зачем плагин создает эту папку? я ведь сам могу ее создать, а он пусть скалдывает в нее картинки

в 13.07.2017.
Добавить Комментарий

Победил. Файлы грузятся на поддомен в нужную папку (кстати, обязательно в этом случае FTP использовать?)

Но при загрузке в библиотеку названию фото добавляется 1499943252 — как это исправить/устранить?

Спасибо!

… и еще вопрос: в режиме маленьком превью картинка не отображается (в большом режиме все норм) https://www.screencast.com/t/Tvbmdi4HPEG0

+ плагин создает на поддомене папки с не правильным названием даты (как исправить?)

)+ при добавлении картинки из библиотеки в статью, на самой статье он также не отображается (хотя ссылка ведет куда надо) (как исправить?) https://www.screencast.com/t/uEELtS8j2

Еще раз спасибо!

Добавить Комментарий

Решено. Спасибо:)

Добавить Комментарий

Ваш ответ

Размещая свой ответ, вы соглашаетесь с правилами сайта.