¿Cómo cambiar las URLs de imágenes en publicaciones por URLs de CDN?
Por alguna razón, mi proveedor de hosting no puede solucionar que cuando uso W3 Total Cache o W3 Super Cache para almacenamiento en caché, el uso de SQL de mi sitio sigue alcanzando picos... y en momentos de alta demanda los servidores se vuelven lentos y a veces se caen.
Por eso tengo que usar el plugin Hyper Cache para el almacenamiento en caché, ya que funciona perfectamente, pero este plugin no soporta CDN... He contratado un servicio CDN de MaxCDN pero para eso tendría que usar W3 Total Cache o Super Cache...
Así que estoy buscando una forma de cambiar automáticamente las URLs de las imágenes en las publicaciones de, por ejemplo: http://www.sitio.com/wp-content/uploads..... a http://cdn.sitio.com/wp-content/uploads...
¿Es posible? Si es así, por favor ayuda. Gracias de antemano.
¿Has visto este plugin? http://wordpress.org/extend/plugins/cdn-rewrites/
De la descripción del plugin:
Básicamente, este plugin permite a un usuario de WordPress especificar dos variables importantes: un host de origen (tu sitio) y un "host de destino" (host CDN). Luego encontrará todos los contenidos estáticos de ese host de origen y los reescribirá en el destino para que se entreguen desde allí.
¿Parece ser lo que necesitas?
------------------------------ EDITADO
Si estás intentando evitar el uso de plugins, aquí hay un gran artículo sobre el tema: http://www.cyberciti.biz/tips/wordpress-cdn-content-delivery-network-configuration.html
Sin embargo, nunca he probado este método. Pero parece una solución limpia.

Una respuesta debería ser más que solo un enlace a un sitio externo. Por favor agrega información a tu respuesta: Qué hace el plugin y cómo funciona. Gracias.

Gracias, lo intentaré pero estoy buscando una forma de hacerlo sin usar ningún plugin

quizás podrías revisar el código del plugin y ver si puedes integrarlo en tu tema. Es un plugin bastante sencillo

Agregué el plugin pero rompió mi panel de administración jaja... ya no puedo agregar etiquetas

Eso es gracioso. El plugin vuelve a agregar jQuery, lo cual es innecesario, y jQueryUI que quizá ya estés ejecutando. Tuve que eliminar el encolamiento porque estaba causando problemas. Puedes comentar esas líneas en cdnr.class.php - aunque no estoy seguro si eso es lo que causa tu problema..

No sé si lo resolviste, pero aquí hay un plugin alternativo para probar: http://wordpress.org/extend/plugins/cdn-sync-tool/ que debe usarse junto con http://wordpress.org/extend/plugins/wp-super-cache/

no, todavía no he podido encontrar una solución y como mencioné anteriormente, super cache no funciona en mi alojamiento. sobre la herramienta de sincronización de cdn, dice que requiere wp super cache para cambios de url lol... lo mismo que mi pregunta, así que no, todavía no hay solución

Si las imágenes permanecen en la misma ubicación y solo deseas cambiar el subdominio, la regla RewriteRule de .htaccess sería la más sencilla:
Si la regla solo aplica a imágenes, entonces:
RewriteCond %{HTTP_HOST} =www.sitename.com
RewriteRule ^.+\.(jpe?g|png|other|img|ext)$ http://cdn.sitename.com/$0 [nocase,redirect=temp,last]
Podrías agregar una prueba RewriteCond para las imágenes, pero la prueba realizada en RewriteCond usa los mismos recursos que hacerla una vez en RewriteRule.
También podrías redirigir todo en el directorio de uploads. Si cdn.sitename.com está pasando por el mismo conjunto de reglas .htaccess, incluiría la declaración RewriteCond:
RewriteCond %{HTTP_HOST} =www.sitename.com
RewriteRule ^wp-content/uploads/.+$ http://cdn.sitename.com/$0 [nocase,redirect=temp,last]
[redirect=temp] o [redirect=permanent]; a menudo escrito como [R=302] y [R=301].
documentación de apache mod_rewrite
(el resaltado/formateo automático de sintaxis no fue diseñado pensando en .htaccess :-)
Saludos,
Gregory

Puedes analizar mediante expresiones regulares para imágenes en the_content
; pero siempre carga y es lento.
Quizás cambies la URL de las imágenes, después de post_save
en la base de datos o modifiques los posts actuales dentro de la base de datos y crees un CDN personalizado. Es la forma más rápida y todos los plugins de caché tienen el problema de que deben analizar el contenido.
Para más información sobre un CDN personalizado en WP, consulta esta respuesta.

Si deseas codificar manualmente los cambios en el src de las imágenes, esta sería la función para ti; wp_update_post( $post ); combinada con un bucle que recorra cada post y post_type que quieras afectar, y usando preg_replace para reemplazar las URL's src.
Asigna la plantilla a una página, carga la página cada vez que quieras actualizar las URL's src, elimina la página cuando no quieras que otros ejecuten el código.
Los patrones de búsqueda/reemplazo de grep_replace() se verían algo así:
buscar: (<img [^>]*?src=['"]https?://)www\.sitename\.com
reemplazar: $1cdn.sitename.com
o más específicamente:
buscar: (<img [^>]*?src=['"]https?://)www(\.sitename\.com/wp-content/uploads/)
reemplazar: $1cdn$2
Aunque wp_update_post() crea una revisión automáticamente por si necesitas revertir el cambio, haz una copia de seguridad de la base de datos antes de cargar la página.
Probaría primero la combinación del bucle, wp_update_post() y preg_replace() en un conjunto limitado de posts, posiblemente especificando los IDs de los posts en un array y recorriéndolo.
Una opción adicional podría ser crear una nueva categoría temporal 'Actualizado a CDN' y asignar esta categoría a cada post a medida que lo actualizas. Así podrías omitir cualquier post con esta categoría en futuras consultas de actualización. La pequeña desventaja es que, aunque elimines la categoría después, los valores seguirían guardados para cada post en la base de datos (corrígeme si me equivoco).
Saludos,
Gregory

¡esta es una gran solución, gregory! aunque realmente recomiendo hacer el reemplazo directamente antes de la acción de guardar, así no tendrás que preocuparte por nuevas publicaciones después. si tu sitio tiene muchas publicaciones, una función que recorra todas las publicaciones una y otra vez tomará mucho tiempo en ejecutarse.

:-) fischi, por eso recomiendo colocar el código en una plantilla especializada, asignar la plantilla a una Página, y solo cargar la Página cuando quieras ejecutar la función de actualización. el programador incluso podría incluir una verificación de roles en la plantilla para solo permitir que los Administradores carguen la Página.

también podrías enlazarte a la acción pre_post_update.
el beneficio de esto es que tu servidor solo necesita intercambiar las URLs una vez, así no siempre usas el script str_replace que escribiste al entregar, sino al guardar.
como asumo que estás familiarizado con el reemplazo en sí, solo coloca tu función dentro de esta función, ¡y listo!
add_action('pre_post_update', 'change_image_urls', 10 );
function change_image_urls( $post_id ) {
// tu función aquí...
// $post = get_post( $post_id );
}

sí tiene sentido, pero considerando que ya hay 990 publicaciones publicadas, no estoy seguro de cómo esto ayudará. así que solo estoy usando un str replace en una función en functions.php que reemplaza...

vale, entiendo tu punto aquí - tal vez podrías escribir una pequeña función para llamar desde el backend, donde busques en todas tus publicaciones y las actualices una vez? sé que tomará un tiempo con las 990 publicadas, pero sería una solución elegante. también podrías usar el plugin de buscar y reemplazar para realizar esta acción directamente en tu base de datos.
