Obține imaginea reprezentativă
Construim o aplicație Android bazată pe o bază de date MySQL WordPress. Am reușit să obținem majoritatea informațiilor din baza de date pentru a le afișa în aplicație. Acum tot ce ne-a mai rămas este să preluăm imaginea reprezentativă a articolelor.
Există vreo modalitate de a obține URL-ul imaginii reprezentative?
Mulțumesc!
ID-ul atașamentului pentru imaginea reprezentativă este stocat în tabela post_meta, cu meta_key _thumbnail_id
.
Folosiți acel ID de postare pentru a găsi meta datele postării cu meta_key _wp_attachment_metadata
.
Valoarea acesteia este un array serializat cu cheile thumb
, file
, width
, height
, sizes
(un array) și image_meta
(un array).
Valoarea file
este relativă la directorul de încărcări pentru instalarea WordPress și indică imaginea originală la dimensiunea completă. Din această valoare ar trebui să puteți calcula URL-ul.
sizes
are ca și cheie o dimensiune a imaginii (de exemplu, 'small', 'medium', 'large', 'thumbnail'), iar valoarea este un array cu cheile file
, height
și width
.
image_meta
va conține informații precum metadatele exif/iptc din imaginea în sine.

Miniatura postării este stocată în tabelul {$wpdb->prefix}_postmeta
cu cheia _thumbnail_id
.
Ceva de genul:
SELECT * from {$wpdb->prefix}_posts
WHERE ID in (
SELECT meta_value FROM {$wpdb->prefix}_postmeta
WHERE meta_key = '_thumbnail_id'
AND post_id = ':ID'
);
Înlocuiți :ID cu ID-ul postării.
Această interogare va returna Postarea asociată cu imaginea în sine - post_title
va fi ceea ce utilizatorul a asociat cu atributul title al imaginii, iar guid
va fi URL-ul imaginii în dimensiune completă.
Dacă doriți alte dimensiuni, va trebui să căutați valoarea postmeta _wp_attachment_metadata
care va conține un array serializat cu toate dimensiunile diferite.
Folosirea API-ului WordPress este mult mai simplă:
<?php
if(has_post_thumbnail($some_post_id))
{
$img = wp_get_attachment_img_src(get_post_thumbnail_id($some_post_id), 'the_image_size');
// returnează un array, primul element este URL-ul imaginii
echo $img[0];
}

Nu depindeți de câmpul guid
pentru a fi un URL ... este menit să fie un identificator unic, nu un link.

Este un punct bun! Există un câmp care stochează URL-ul real al imaginii în afara câmpului postmeta _wp_attachment_metadata
?

Asta încercăm să aflăm... Am găsit fișierul real al imaginii în baza de date, dar avem nevoie de o metodă pentru a apela imaginea în cadrul interogării SQL.

Aruncă o privire la wp_get_attachment_url()
și cum construiește URL-ul pentru imaginile atașate pe baza ID-ului ...

Imaginea reprezentativă a postării este un atașament obișnuit la postare. Așadar, ca și în cazul oricărui alt atașament de imagine, va trebui să interogați tabelul wp_posts
pentru un tip de postare de tip attachment
. Trucul este să obțineți mai întâi ID-ul atașamentului pe care trebuie să-l preluați.
Acesta este conținut în metadatele postării respective, mai precis în meta-ul _thumbnail_id
.
Deci, veți avea nevoie de o interogare care:
- Recuperează valoarea marcată prin cheia
_thumbnail_id
din tabelulwp_postmeta
pe baza unui ID de postare dat. - Recuperează atașamentul din tabelul
wp_posts
pe baza ID-ului obținut la pasul #1 - Generează un link permanent (permalink) pentru atașament pe baza informațiilor obținute la pasul #2
Dar, sincer, faceți mult efort pentru a reinventa roata...

Iată ce am folosit pentru a prelua datele postării, URL-ul imaginii reprezentative și detaliile acesteia (cum ar fi dimensiunile):
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;

Folosiți următoarea interogare pentru a prelua imaginile reprezentative ale tuturor articolelor:
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'

Cea mai bună soluție SQL,
Caută ID-ul din wp_post
SELECT * FROM wp_posts WHERE post_status='publish'
Găsește conținutul meta
SELECT * FROM wp_postmeta WHERE meta_key='_thumbnail_id' AND post_id=MyID
Cu ID-ul thumbnail-ului, caută încă o dată în wp_postmeta fișierul
SELECT * FROM wp_postmeta WHERE meta_key='_wp_attached_file' AND post_id=MyID
Iată un exemplu.
$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 ."]}";
