Как изменить URL изображений в записях на URL CDN? Решение для WordPress
По некоторым причинам мой хостинг-провайдер не может исправить проблему, когда при использовании 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...
Возможно ли это? Если да, пожалуйста, помогите. Заранее спасибо.

Вы смотрели этот плагин? http://wordpress.org/extend/plugins/cdn-rewrites/
Из описания плагина:
По сути, этот плагин позволяет пользователю WordPress указать две важные переменные: исходный хост (ваш сайт) и "хост назначения" (CDN хост). Затем он найдет все статические ресурсы с этого исходного хоста и перепишет их в назначение, чтобы они доставлялись оттуда.
Кажется, это то, что вам нужно?
------------------------------ РЕДАКТИРОВАНО
Если хотите избежать использования плагинов, вот отличная статья на эту тему: http://www.cyberciti.biz/tips/wordpress-cdn-content-delivery-network-configuration.html
Однако я сам не пробовал этот метод. Но выглядит как чистое решение.

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

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

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

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

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

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

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

Если изображения остаются в том же месте, и вы хотите только изменить поддомен, то 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 :-)
С уважением,
Григорий

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

Если вы хотите жестко прописать изменения для атрибута 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" и назначение этой категории каждой записи по мере ее обновления. Затем вы можете исключать записи с этой категорией из будущих запросов на обновление. Небольшой недостаток этого подхода в том, что даже если вы позже удалите категорию, значения все равно останутся сохраненными для каждой записи в базе данных (поправьте меня, если я ошибаюсь).
С уважением,
Григорий

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

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

вы также можете использовать хук 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 );
}

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

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