Extraer imágenes de un post en WP

En principio esto no sería complicado sabiendo que hay muchos plugins que lo hacen, y en otras muchas webs te explican como hacerlo desde el propio código con funciones.

Pero claro, estos plugins o explicaciones están fundamentados en el uso de la herramienta media del propio wordPress.

Sinceramente, hay algo que no me gusta mucho de esta herramienta, y es que guarda todos los elementos (imágenes, audio, video) en la tabla wp_post de la base de datos, justo donde se guardan los post y las páginas, por lo que si eres amigo de adornar los post con imágenes, esta tabla termina saturada con – a mi entender – contenido innecesario.

Es por eso que utilizo editores externos para la inserción de imágenes, por lo que los que las soluciones para extraer las imágenes de un post no son válidas.

Para esto, se podría crear una función de este tipo, que extraiga todas las imágenes de un post, y seleccione la primera encontrada.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function get_first_image_thumb()
{
// Recuperamos el post
$Html = strtolower(get_the_content());

// Extraemos todas las imagenes
$extrae = '/img .*src=["']([^ ^"^']*)["']/';

// Extraemos todas las imágenes
preg_match_all( $extrae , $Html , $matches );

// donde
// [1] -> segundo elemento del array "texto/imagenes"
// [0] -> primera imagen del array de "imagenes"
$image = $matches[1][0];

if($image)
{
echo '< div class="entry-thumb"/>
<img src="'
.$image.'" alt="" />
</div>'
;
} else {
return false;
}
}

Eso si, el tamaño de la miniatura ya dependería de vosotros. En mi caso como las imágenes no son muy grandes, modifico su tamaño con css.

Ahora simplemente nos quedaría llamar a esta función en la entrada del blog

1
<div><?php get_first_image_thumb(); ?><?php the_excerpt(); ?></div>

Esta función es extrapolable a cualquier otro cms. Simplemente habría que cambiar el valor de la variable «$Html» por el del texto del cuál queramos extraer las imágenes.

13 comentarios.


  • 2 de febrero de 2010 a las 11:37
    Leonardo dice...
    Hola. La función funciona de maravillas pero tengo una duda y no se si lo has pensado o ya desarrollado. ¿Cómo extraer la url de todas las imágenes y no sólo de la primera?

  • 2 de febrero de 2010 a las 12:42
    cmacias dice...
    En principio la función encuentra sólo la primera imagen. Podría modificarse para que pueda encontrar todas. Sería cuestión de echarle un vistazo y ponerse a ello.

  • 12 de mayo de 2010 a las 1:24
    Daniel Lemos dice...
    Muchas Gracias! muy bueno!

  • 25 de noviembre de 2010 a las 17:02
    expresa dice...
    Exelente el codigo! me funciono de maravillas...
    Solo un temita... parece ser que cuando devuelve la direccion de la primera imagen hay un problema:

    Cuando la imagen tiene caracteres en mayusculas, devuelve de todas formas los caracteres con minusculas.... entonces no se muestra la imagen... se puede solucionar?

    .../img/DSC_105.jpg (Direccion de la imagen)
    .../img/dsc_105.jpg (De esta manera no se ve la imagen)



    Gracias!

  • 25 de noviembre de 2010 a las 17:31
    cmacias dice...
    Hola Expresa, gracias por tu comentario.

    Si habría una solución. En la línea 4, lo que hago es meter el contenido en una variable y convertirlo todo en minúsculas
    $Html = strtolower(get_the_content());

    Para evitar que te cambiara los tamaños, simplemente habría que cambiarlo por
    $Html = get_the_content();

    Un saludo

  • 19 de septiembre de 2011 a las 20:29
    refrigerator repair dice...
    Gracias por resumirlo tan bien. Creo que voy a regresar aquí a menudo. Saludos cordiales.

  • 29 de noviembre de 2011 a las 13:07
    snake dice...
    hola tengo una duda quisiera que me la aclares, esta función extrae la primera imagen del post alojada en un host externo como blogspot?, si es asi comentaste algo que la almacenaria en mi base de datos de los post, eso no me quedo claro, esta función al usar una imagen externa ya no me consumiría transferencia mensual como lo hace la imagen destacada de wordpress verdad??

  • 29 de noviembre de 2011 a las 13:17
    cmacias dice...
    Snake, en principio utilizo un expresión regular para extraer todo tipo de contenido dentro del atributo "src" de la etiqueta "img", por lo que la respuesta es SI. Con esta función también extraería imágenes alojadas en otro hosting o sistema.

    En este caso al ser una imagen externa nos olvidamos de la base de datos, ya que en ella se almacenan las imágenes locales, y en tu caso es una imagen remota.

  • 29 de noviembre de 2011 a las 13:26
    snake dice...
    no funciona bien, no se ven las imagenes de imgur aparece un cartel que no existe pero si existe, no se ven las de blogger tampoco ayuda !!

  • 29 de noviembre de 2011 a las 13:32
    cmacias dice...
    Y lo estás usando sobre un wordpress ? que error te arroja ?

  • 29 de noviembre de 2011 a las 14:16
    snake dice...
    si es un wordpress, el código no me da error, las imagenes no aparecen y las de imgur me dice quen no existe, solo aparecen algunasdigamos un 10% , mi web esta en mi nick

  • 29 de noviembre de 2011 a las 14:36
    snake dice...
    cmacias el error de la imagen era muy extraño estuve pensando y de pronto se me ocurrió que me suceda lo mismo que le pasó a expresa, y efectivamente las imagenes cuya url llevaba mayusculas no se veían o me daban error(no existe), reemplaze la parte 4º del código como lo explicaste arriba y solucionó todo por ahora, es muy efectiva esta función, justo tenía un aumento de transferencía muy alto y ahora puedo comprobar si el aumento era por las imagenes o algo mas.

    De todas maneras seguire subiendo la imagen destacada sin emplearlas, me pueden servir en otro momento.

    Muy agradecido cmacias, si se me presenta algun problema acudiré a tu web que por cierto la atención es inmediata. ;)

  • 29 de noviembre de 2011 a las 14:46
    snake dice...
    me apresure en despedirme, olvide algo importante yo usaba con la funcion thumbnail varos tamaños para la img destacada dependiendo en que parte esté, para el index yo usaba 214*280, para archivos 100*140 y paginas especiales otra resolución, que debería cambiar ya que hasta el momento solo me muestra una resolución que indique en la funcion:

    echo '
Deja tu comentario