Получить изображение записи
Мы разрабатываем приложение для Android на основе базы данных MySQL WordPress. Нам удалось получить большую часть информации из базы данных для отображения в приложении. Теперь осталось только получить изображение записи.
Есть ли способ получить URL изображения записи?
Спасибо!

Идентификатор вложения миниатюры записи хранится в таблице post_meta с meta_key _thumbnail_id
.
Используйте этот ID записи, чтобы найти метаданные записи с meta_key _wp_attachment_metadata
.
Значение представляет собой сериализованный массив с ключами thumb
, file
, width
, height
, sizes
(массив) и image_meta
(массив).
Значение file
указывает на оригинальное изображение в полном размере относительно директории загрузок WordPress. На основе этого можно вычислить URL изображения.
sizes
содержит ключи с размерами изображения (например, 'small', 'medium', 'large', 'thumbnail'), а значением является массив с ключами file
, height
и width
.
image_meta
содержит метаданные изображения, такие как exif/iptc, извлеченные из самого изображения.

Миниатюра записи хранится в таблице {$wpdb->prefix}_postmeta
с ключом _thumbnail_id
.
Пример запроса:
SELECT * from {$wpdb->prefix}_posts
WHERE ID in (
SELECT meta_value FROM {$wpdb->prefix}_postmeta
WHERE meta_key = '_thumbnail_id'
AND post_id = ':ID'
);
Замените :ID на идентификатор записи.
Этот запрос вернёт саму запись изображения — поле post_title
будет содержать заголовок, который пользователь указал в атрибуте title изображения, а guid
будет содержать URL изображения в полном размере.
Если вам нужны другие размеры, вам нужно посмотреть значение метаполя _wp_attachment_metadata
, которое содержит сериализованный массив со всеми доступными размерами.
Использование WordPress API значительно проще:
<?php
if(has_post_thumbnail($some_post_id))
{
$img = wp_get_attachment_img_src(get_post_thumbnail_id($some_post_id), 'the_image_size');
// возвращает массив, первый элемент — URL изображения
echo $img[0];
}

Не полагайтесь на поле guid
как на URL... оно предназначено для уникального идентификатора, а не для ссылки.

Хорошее замечание! Есть ли поле, которое хранит фактический URL изображения вне поля postmeta _wp_attachment_metadata
?

Это как раз то, что мы пытаемся выяснить... Я нашел сам файл изображения в базе данных, но нам нужен способ вызвать изображение внутри SQL-запроса.

Посмотрите на wp_get_attachment_url()
и как она формирует URL для прикрепленных изображений на основе ID...

Изображение записи (featured image) - это обычное вложение (attachment) к записи. Поэтому, как и с любым другим вложением-изображением, вам нужно выполнить запрос к таблице wp_posts
для типа записи attachment
. Основная хитрость заключается в том, чтобы сначала получить ID вложения, которое нужно извлечь.
Эта информация содержится в метаданных указанной записи, конкретно в метаполе _thumbnail_id
.
Таким образом, вам понадобится запрос, который:
- Извлекает значение с ключом
_thumbnail_id
из таблицыwp_postmeta
на основе заданного ID записи. - Извлекает вложение из таблицы
wp_posts
по ID, полученному в шаге №1 - Генерирует постоянную ссылку (permalink) для вложения на основе информации, полученной в шаге №2
Хотя, по правде говоря, вы делаете много лишней работы, изобретая велосипед...

Вот что я использовал для получения данных записи, URL миниатюры и деталей изображения (таких как размеры):
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;

Используйте следующий запрос для получения миниатюр всех записей:
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'

Лучшее SQL-решение,
Поиск ID из wp_post
SELECT * FROM wp_posts WHERE post_status='publish'
Найти мета-контент
SELECT * FROM wp_postmeta WHERE meta_key='_thumbnail_id' AND post_id=MyID
С ID миниатюры, ищем файл еще раз в wp_postmeta
SELECT * FROM wp_postmeta WHERE meta_key='_wp_attached_file' AND post_id=MyID
Вот один пример.
$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 ."]}";
