Obține imaginea reprezentativă

6 iul. 2012, 23:45:43
Vizualizări: 25.1K
Voturi: 10

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!

0
Toate răspunsurile la întrebare 6
0
17

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.

7 iul. 2012 01:25:09
4

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];
}
7 iul. 2012 00:07:41
Comentarii

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

EAMann EAMann
7 iul. 2012 00:14:41

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

chrisguitarguy chrisguitarguy
7 iul. 2012 00:15:46

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.

Martin Hasan Martin Hasan
7 iul. 2012 00:18:40

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

EAMann EAMann
7 iul. 2012 00:27:54
0

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:

  1. Recuperează valoarea marcată prin cheia _thumbnail_id din tabelul wp_postmeta pe baza unui ID de postare dat.
  2. Recuperează atașamentul din tabelul wp_posts pe baza ID-ului obținut la pasul #1
  3. 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...

7 iul. 2012 00:00:14
0

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;
20 mar. 2018 12:15:54
0

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'
28 mai 2017 20:29:25
1

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 ."]}";
1 sept. 2017 04:49:09
Comentarii

Este mai bine să folosești json_encode(), $row[post_date] ar genera notificări/avertismente deoarece cheia nu este între ghilimele

Svetoslav Marinov Svetoslav Marinov
8 apr. 2020 16:32:38