Recuperare l'immagine in evidenza
Stiamo sviluppando un'app Android basata su un database MySQL di WordPress. Siamo riusciti a ottenere la maggior parte delle informazioni dal database per visualizzarle nell'app. Ora ci manca solo recuperare l'immagine in evidenza dei post.
C'è un modo per ottenere l'URL dell'immagine in evidenza?
Grazie!
L'ID dell'allegato dell'immagine in evidenza è memorizzato nella tabella post_meta, con la meta_key _thumbnail_id
.
Utilizza quell'ID del post per trovare i post meta con la meta_key _wp_attachment_metadata
.
Il valore corrispondente è un array serializzato con le chiavi thumb
, file
, width
, height
, sizes
(un array) e image_meta
(un array).
Il valore file
è relativo alla directory uploads dell'installazione di WP e punta all'immagine originale a dimensione intera. Dovresti essere in grado di calcolare l'URL a partire da questo.
sizes
ha come chiave una dimensione dell'immagine (es. 'small', 'medium', 'large', 'thumbnail'), e il valore è un array con le chiavi file
, height
e width
.
image_meta
conterrà metadati come i dati exif/iptc estratti dall'immagine stessa.

La miniatura del post è memorizzata nella tabella {$wpdb->prefix}_postmeta
con la chiave _thumbnail_id
.
Qualcosa come questo:
SELECT * from {$wpdb->prefix}_posts
WHERE ID in (
SELECT meta_value FROM {$wpdb->prefix}_postmeta
WHERE meta_key = '_thumbnail_id'
AND post_id = ':ID'
);
Sostituisci :ID con l'ID del post.
Questo restituirà il Post associato all'immagine stessa - il post_title
sarà quello che l'utente ha associato all'attributo title dell'immagine, e il guid
sarà l'URL dell'immagine a grandezza intera.
Se vuoi dimensioni diverse, dovrai cercare il valore postmeta _wp_attachment_metadata
che conterrà un array serializzato con tutte le diverse dimensioni.
Usare l'API di WordPress è molto più semplice:
<?php
if(has_post_thumbnail($some_post_id))
{
$img = wp_get_attachment_img_src(get_post_thumbnail_id($some_post_id), 'the_image_size');
// restituisce un array, il primo elemento è l'URL dell'immagine
echo $img[0];
}

Non dipendere dal campo guid
per essere un URL... è pensato per essere un identificatore univoco, non un link.

Ottimo punto! C'è un campo che memorizza l'URL effettivo dell'immagine al di fuori del campo postmeta _wp_attachment_metadata
?

È proprio quello che stiamo cercando di capire... Ho trovato il file effettivo dell'immagine nel database, ma abbiamo bisogno di un modo per richiamare l'immagine all'interno della query SQL.

Dai un'occhiata a wp_get_attachment_url()
e a come costruisce l'URL per le immagini allegate in base all'ID ...

L'immagine in evidenza di un post è un normale allegato al post. Quindi, come per qualsiasi altro allegato di tipo immagine, dovrai interrogare la tabella wp_posts
cercando un post di tipo attachment
. Il trucco è prima ottenere l'ID dell'allegato che devi recuperare.
Questo è contenuto nelle meta informazioni del post in questione, specificatamente nel meta _thumbnail_id
.
Quindi, avrai bisogno di una query che:
- Recuperi il valore contrassegnato dalla chiave
_thumbnail_id
nella tabellawp_postmeta
basandoti su un dato ID del post. - Recuperi l'allegato dalla tabella
wp_posts
basandoti sull'ID ottenuto nel punto #1 - Generi un permalink per l'allegato basandoti sulle informazioni ottenute nel punto #2
In realtà però, stai facendo un sacco di lavoro per reinventare la ruota...

Ecco cosa ho utilizzato per recuperare i dati del post, l'URL dell'immagine in evidenza e i dettagli dell'immagine in evidenza (come le dimensioni):
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;

Utilizza la seguente query per recuperare le immagini in evidenza di tutti gli articoli:
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 migliore soluzione SQL,
Cerca l'ID da wp_post
SELECT * FROM wp_posts WHERE post_status='publish'
Trova il contenuto meta
SELECT * FROM wp_postmeta WHERE meta_key='_thumbnail_id' AND post_id=MioID
Con l'ID della miniatura, cerca ancora una volta nel wp_postmeta il file
SELECT * FROM wp_postmeta WHERE meta_key='_wp_attached_file' AND post_id=MioID
Ecco un esempio.
$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 ."]}";
