¿Cómo cambiar las URLs de imágenes en publicaciones por URLs de CDN?

19 abr 2012, 18:38:42
Vistas: 17.8K
Votos: 1

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.

0
Todas las respuestas a la pregunta 5
7

¿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.

19 abr 2012 20:11:35
Comentarios

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.

fuxia fuxia
19 abr 2012 20:16:17

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

Ayaz Malik Ayaz Malik
20 abr 2012 00:47:35

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

Starfs Starfs
20 abr 2012 05:06:49

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

Ayaz Malik Ayaz Malik
20 abr 2012 13:12:44

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..

Starfs Starfs
20 abr 2012 18:33:41

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/

Starfs Starfs
24 abr 2012 16:09:25

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

Ayaz Malik Ayaz Malik
24 abr 2012 22:23:10
Mostrar los 2 comentarios restantes
0

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

1 may 2012 19:17:55
1

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.

29 abr 2012 20:55:21
Comentarios

Gracias por indicar la dirección correcta, creé mi propia función usando simplemente str_replace... en el contenido. Y funcionó, lo publicaré aquí en unos minutos

Ayaz Malik Ayaz Malik
30 abr 2012 02:22:31
3

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

2 may 2012 09:13:05
Comentarios

¡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 fischi
2 may 2012 10:12:21

:-) 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.

Gregory Gregory
2 may 2012 15:04:43

ah, ya veo. pensé que querías ejecutar la actualización en la plantilla frontal de la página, error mío ;) también tienes razón con la categoría, incluyendo la pequeña desventaja - pero combinando nuestros métodos no necesitarías ejecutar el script nuevamente después :)

fischi fischi
2 may 2012 15:46:12
2

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 );

}
1 may 2012 20:09:18
Comentarios

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...

Ayaz Malik Ayaz Malik
2 may 2012 01:08:36

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.

fischi fischi
2 may 2012 10:10:10