Как изменить URL изображений в записях на URL CDN? Решение для WordPress

19 апр. 2012 г., 18:38:42
Просмотры: 17.8K
Голосов: 1

По некоторым причинам мой хостинг-провайдер не может исправить проблему, когда при использовании W3 Total Cache или W3 Super Cache нагрузка на SQL сервер достигает пиковых значений... При высоких нагрузках сервер начинает лагать и иногда падает.

Поэтому мне пришлось использовать плагин Hyper Cache для кэширования, так как он работает идеально, но этот плагин не поддерживает CDN... Я купил CDN сервис от MaxCDN, но для его использования мне пришлось бы использовать W3 Total Cache или Super Cache...

Итак, я ищу способ автоматически изменять URL изображений в записях с, например: http://www.sitename.com/wp-content/uploads..... на http://cdn.sitename.com/wp-content/uploads...

Возможно ли это? Если да, пожалуйста, помогите. Заранее спасибо.

0
Все ответы на вопрос 5
7

Вы смотрели этот плагин? http://wordpress.org/extend/plugins/cdn-rewrites/

Из описания плагина:

По сути, этот плагин позволяет пользователю WordPress указать две важные переменные: исходный хост (ваш сайт) и "хост назначения" (CDN хост). Затем он найдет все статические ресурсы с этого исходного хоста и перепишет их в назначение, чтобы они доставлялись оттуда.

Кажется, это то, что вам нужно?

------------------------------ РЕДАКТИРОВАНО

Если хотите избежать использования плагинов, вот отличная статья на эту тему: http://www.cyberciti.biz/tips/wordpress-cdn-content-delivery-network-configuration.html

Однако я сам не пробовал этот метод. Но выглядит как чистое решение.

19 апр. 2012 г. 20:11:35
Комментарии

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

fuxia fuxia
19 апр. 2012 г. 20:16:17

Спасибо, я попробую это, но я ищу способ без использования плагинов

Ayaz Malik Ayaz Malik
20 апр. 2012 г. 00:47:35

возможно, стоит посмотреть код плагина и попробовать адаптировать его для вашей темы. это достаточно простой плагин

Starfs Starfs
20 апр. 2012 г. 05:06:49

я добавил плагин, но он сломал мою админку лол.. теперь не могу добавлять теги

Ayaz Malik Ayaz Malik
20 апр. 2012 г. 13:12:44

это лол. плагин снова подключает jquery, что не нужно, и jqueryui, который у вас уже может быть. мне пришлось убрать их подключение, потому что это вызывало проблемы. вы можете закомментировать эти строки в cdnr.class.php - не уверен, что это причина вашей проблемы, но возможно..

Starfs Starfs
20 апр. 2012 г. 18:33:41

не знаю, разобрались ли вы, но вот альтернативный плагин для проверки: http://wordpress.org/extend/plugins/cdn-sync-tool/ который можно использовать вместе с http://wordpress.org/extend/plugins/wp-super-cache/

Starfs Starfs
24 апр. 2012 г. 16:09:25

Нет, до сих пор не удалось найти решение, и, как я упомянул выше, Super Cache не работает на моем хостинге. Что касается инструмента синхронизации CDN, там сказано, что для изменения URL требуется WP Super Cache, лол... То же самое, что и в моем вопросе, так что нет, решения пока нет.

Ayaz Malik Ayaz Malik
24 апр. 2012 г. 22:23:10
Показать остальные 2 комментариев
0

Если изображения остаются в том же месте, и вы хотите только изменить поддомен, то RewriteRule в .htaccess будет самым простым решением:

Если правило применяется только к изображениям, тогда:

RewriteCond   %{HTTP_HOST}   =www.sitename.com
RewriteRule   ^.+\.(jpe?g|png|other|img|ext)$   http://cdn.sitename.com/$0   [nocase,redirect=temp,last]

Вы можете добавить проверку RewriteCond для изображений, но проверка, выполняемая в RewriteCond, использует те же ресурсы, что и однократная проверка в RewriteRule.

Вы также можете перенаправить все содержимое директории uploads. Если cdn.sitename.com проходит через тот же набор правил .htaccess, я бы включил условие RewriteCond:

RewriteCond   %{HTTP_HOST}   =www.sitename.com
RewriteRule    ^wp-content/uploads/.+$   http://cdn.sitename.com/$0   [nocase,redirect=temp,last]

[redirect=temp] или [redirect=permanent]; часто записывается как [R=302] и [R=301].

документация по mod_rewrite в Apache

(автоматическое подсвечивание синтаксиса/форматирование не было рассчитано на .htaccess :-)

С уважением,
Григорий

1 мая 2012 г. 19:17:55
1

Вы можете разбирать изображения через регулярные выражения в the_content, но это всегда приводит к загрузке и замедлению работы. Возможно, вам стоит изменить URL изображений после сохранения поста (post_save) в базе данных или изменить текущие записи в базе данных и создать собственный CDN. Это самый быстрый способ, так как все плагины кэширования сталкиваются с проблемой необходимости парсинга контента. Для понимания работы собственного CDN в WordPress ознакомьтесь с этим ответом.

29 апр. 2012 г. 20:55:21
Комментарии

Спасибо за указание правильного направления! Я создал свою функцию, просто используя str_replace... в контенте, и это сработало. Опубликую её здесь через пару минут.

Ayaz Malik Ayaz Malik
30 апр. 2012 г. 02:22:31
3

Если вы хотите жестко прописать изменения для атрибута img src, вам подойдет функция wp_update_post( $post ); в сочетании с циклом, который проходит через каждую запись и тип записи, которые вы хотите изменить, а также использование preg_replace для замены URL-адресов в src.

Назначьте шаблон для страницы, загружайте страницу, когда хотите обновить URL-адреса src, и удаляйте ее, когда не хотите, чтобы другие могли выполнять этот код.

Шаблоны поиска/замены для grep_replace() будут выглядеть примерно так:

поиск: (<img [^>]*?src=['"]https?://)www\.sitename\.com
замена: $1cdn.sitename.com

или более конкретно:

поиск: (<img [^>]*?src=['"]https?://)www(\.sitename\.com/wp-content/uploads/)
замена: $1cdn$2

Хотя wp_update_post() автоматически создает ревизию на случай, если вам потребуется отменить изменения, сделайте резервную копию базы данных перед загрузкой страницы.

Я бы сначала протестировал комбинацию цикла, wp_update_post() и preg_replace() на ограниченном наборе записей, возможно, указав ID целевых записей в массиве и последовательно обрабатывая его.

Дополнительным вариантом может быть создание новой временной категории "Обновлено CDN" и назначение этой категории каждой записи по мере ее обновления. Затем вы можете исключать записи с этой категорией из будущих запросов на обновление. Небольшой недостаток этого подхода в том, что даже если вы позже удалите категорию, значения все равно останутся сохраненными для каждой записи в базе данных (поправьте меня, если я ошибаюсь).

С уважением,
Григорий

2 мая 2012 г. 09:13:05
Комментарии

это отличное решение, Грегори! хотя я настоятельно рекомендую делать замену непосредственно перед действием сохранения, так как вам не придется беспокоиться о новых записях в будущем. если на вашем сайте много записей, функция, которая циклически перебирает все записи снова и снова, занимает много времени для выполнения.

fischi fischi
2 мая 2012 г. 10:12:21

:-) Фиши, именно поэтому я рекомендую поместить код в специализированный шаблон, назначить этот шаблон Странице и загружать эту Страницу только тогда, когда вы хотите запустить функцию обновления. Программист может даже включить проверку роли в шаблоне, чтобы разрешить загрузку Страницы только Администраторам.

Gregory Gregory
2 мая 2012 г. 15:04:43

о, понятно. я думал, что вы хотите запустить обновление на шаблоне фронтенда страницы, моя ошибка ;) вы также правы насчет категории, включая небольшой недостаток - но, комбинируя наши методы, вам не нужно будет запускать скрипт снова после этого :)

fischi fischi
2 мая 2012 г. 15:46:12
2

вы также можете использовать хук pre_post_update.

преимущество этого подхода в том, что ваш сервер будет заменять url только один раз - вместо постоянного использования str_replace при выдаче контента, замена будет происходить при сохранении.

поскольку я предполагаю, что вы знакомы с самой заменой, просто поместите вашу функцию в эту функцию, и готово!

add_action('pre_post_update', 'change_image_urls', 10 );

function change_image_urls( $post_id ) {

    // ваша функция здесь...

    // $post = get_post( $post_id );

}
1 мая 2012 г. 20:09:18
Комментарии

да, это логично, но учитывая, что уже опубликовано 990 постов, я не уверен, как это поможет. поэтому я просто использую str replace в функции в functions.php, которая заменяет...

Ayaz Malik Ayaz Malik
2 мая 2012 г. 01:08:36

хорошо, я понимаю вашу точку зрения - возможно, вы могли бы написать небольшую функцию для вызова из бэкенда, которая бы проходилась по всем вашим постам и обновляла их один раз? я понимаю, что с 990 опубликованными это займет время, но это было бы элегантным решением. вы также можете использовать плагин поиска и замены, чтобы выполнить это действие напрямую в вашей базе данных.

fischi fischi
2 мая 2012 г. 10:10:10