Obtener imagen destacada
Estamos desarrollando una aplicación Android basada en una base de datos MySQL de WordPress. Pudimos obtener la mayoría de la información de la base de datos para mostrarla en la aplicación. Ahora solo nos falta obtener la imagen destacada de las entradas.
¿Hay alguna manera de obtener la URL de la imagen destacada?
¡Gracias!
El ID del archivo adjunto de la imagen destacada se almacena en la tabla post_meta, con la meta_key _thumbnail_id
.
Usa ese ID de publicación para encontrar la metadata de la publicación con la meta_key _wp_attachment_metadata
.
El valor de eso es un array serializado con las claves thumb
, file
, width
, height
, sizes
(un array), y image_meta
(un array).
El valor file
es relativo al directorio de subidas de la instalación de WordPress, y apunta a la imagen original en tamaño completo. Deberías poder calcular la URL a partir de eso.
sizes
tiene un tamaño de imagen como clave (por ejemplo, 'small', 'medium', 'large', 'thumbnail'), y el valor es un array con las claves file
, height
, y width
.
image_meta
contendrá metadatos de la imagen como exif/iptc de la propia imagen.

La imagen destacada del post se almacena en la tabla {$wpdb->prefix}_postmeta
con la clave _thumbnail_id
.
Algo como esto:
SELECT * from {$wpdb->prefix}_posts
WHERE ID in (
SELECT meta_value FROM {$wpdb->prefix}_postmeta
WHERE meta_key = '_thumbnail_id'
AND post_id = ':ID'
);
Reemplaza :ID con el ID del post.
Eso devolverá el Post asociado con la imagen en sí - el post_title
será lo que el usuario asoció con el atributo de título en la imagen, y el guid
será la URL de la imagen en tamaño completo.
Si quieres diferentes tamaños, tendrás que buscar el valor postmeta _wp_attachment_metadata
que contendrá un array serializado con todos los diferentes tamaños.
Usar la API de WordPress es mucho más fácil:
<?php
if(has_post_thumbnail($some_post_id))
{
$img = wp_get_attachment_img_src(get_post_thumbnail_id($some_post_id), 'the_image_size');
// devuelve un array, el primer elemento es la URL de la imagen
echo $img[0];
}

No dependas del campo guid
para que sea una URL ... está destinado a ser un identificador único, no un enlace.

¡Ese es un buen punto! ¿Hay algún campo que almacene la URL real de la imagen fuera del campo postmeta _wp_attachment_metadata
?

Eso es lo que estamos intentando averiguar... He encontrado el archivo de imagen real en la base de datos, pero necesitamos una forma de llamar a la imagen dentro de la consulta SQL.

Echa un vistazo a wp_get_attachment_url()
y cómo construye la URL para imágenes adjuntas basándose en el ID ...

La imagen destacada de una publicación es un adjunto común en WordPress. Por lo tanto, como con cualquier otro archivo adjunto de imagen, necesitarás consultar la tabla wp_posts
para un tipo de publicación attachment
. El truco es primero obtener el ID del adjunto que necesitas recuperar.
Esta información está contenida en los metadatos de la publicación específica, concretamente en el meta _thumbnail_id
.
Así que necesitarás una consulta que:
- Recupere el valor marcado por la clave
_thumbnail_id
en la tablawp_postmeta
basado en un ID de publicación dado. - Recupere el adjunto de la tabla
wp_posts
basado en el ID obtenido en el paso #1 - Genere un enlace permanente para el adjunto basado en la información obtenida en el paso #2
En realidad, aunque estás haciendo mucho trabajo para reinventar la rueda aquí...

Esto es lo que utilicé para obtener los datos del post, la URL de la imagen destacada y los detalles de la imagen destacada (como las dimensiones):
SELECT p.*, ( SELECT guid FROM wp_posts WHERE id = m.meta_value ) AS imgurl, (SELECT meta_value FROM wp_postmeta pm WHERE meta_key='_wp_attachment_metadata' AND pm.post_id=m.meta_value ) AS imgdetails
FROM wp_posts p
LEFT JOIN wp_postmeta m ON(p.id = m.post_id AND m.meta_key = '_thumbnail_id' )
WHERE p.post_type = 'post'
AND p.post_status = 'publish' AND p.id=@postId;

Utiliza la siguiente consulta para recuperar las imágenes destacadas de todas las publicaciones:
SELECT result.post_parent, result.guid AS featuredImage
FROM wp_posts AS p
INNER JOIN wp_postmeta AS pm ON p.ID=pm.post_id
INNER JOIN wp_posts as result ON pm.meta_value = result.ID
WHERE pm.meta_key = '_thumbnail_id' AND p.post_type='post' AND
p.post_status = 'publish'

La mejor solución SQL,
Buscar el ID desde wp_post
SELECT * FROM wp_posts WHERE post_status='publish'
Encontrar el contenido meta
SELECT * FROM wp_postmeta WHERE meta_key='_thumbnail_id' AND post_id=MiID
Con el ID de la miniatura, buscar una vez más en wp_postmeta el archivo
SELECT * FROM wp_postmeta WHERE meta_key='_wp_attached_file' AND post_id=MiID
Aquí un ejemplo.
$query = mysql_query("SELECT * FROM wp_posts WHERE post_status='publish' ORDER BY id DESC LIMIT 6") or die(mysql_error());
$json='{ "Blog" : [ ';
while($row = mysql_fetch_array($query)){
$queryMeta = mysql_query("SELECT * FROM wp_postmeta WHERE meta_key='_thumbnail_id' AND post_id=$row[ID]") or die(mysql_error());
$f = mysql_fetch_array($queryMeta);
$value = $f[meta_value];
$queryMeta2 = mysql_query("SELECT * FROM wp_postmeta WHERE meta_key='_wp_attached_file' AND post_id=$value") or die(mysql_error());
$f2 = mysql_fetch_array($queryMeta2);
$value = $f2[meta_value];
$json .= '{"id" : "'.$row[ID].'", "date" : "'.$row[post_date].'", "title" :"'.$row[post_title].'", "link" : "'.$row[guid].'", "image" :"https://dartesanos.com/blog/wp-content/uploads/'.$value.'"},';
}
$json = substr($json, 0, -1);
echo $json ."]}";
