Как получить attachment_id?
Это тривиальная задача, но я не могу найти ответ, я видел некоторые подсказки вроде поиска в базе данных и т.д., но это безумие.
В основном, у меня есть метабокс с кнопкой загрузки, которая позволяет загружать или выбирать существующее изображение из Медиатеки, вот как я получаю URL этого изображения:
$my_image = get_post_meta($post->ID, '_my_image_metabox', true);
Конечно, я хочу отобразить точный размер этого изображения, поэтому мне нужно использовать:
wp_get_attachment_image_src($attachment_id, 'desired-size');
Вопрос в том, как получить attachment_id
из _my_image_metabox
? Я искал буквально везде, и нет разумных ответов, как должен работать wp_get_attachment_image_src()
, если в Codex нет ни единой строчки о получении $attachment_id
? :)
[обновлено]
var_dump($my_image)
возвращает:
array(1) { [0]=> string(86) "http://localhost/theme/wp-content/uploads/2014/10/my_image.jpg" }
Сохранение данных довольно сложное, так как я использую свой собственный класс для генерации метабоксов, что-то вроде этого: https://github.com/nyordanov/SmartMetaBox/blob/master/SmartMetaBox.php
Как мне тогда внедрить правильный attachment_id в my_image? Добавлю, что у меня несколько (10) полей, подобных этому, и я хотел бы, чтобы каждое из них имело отдельный, уникальный attachment_id.
Хорошо, все эти гиперсложные функции можно свести к одной простой команде: attachment_url_to_postid
Вам нужно просто разобрать URL изображения, чтобы получить ID вложения:
<?php
$attachment_id = attachment_url_to_postid( $image_url );
echo $attachment_id;
?>
Это всё, что вам нужно.

У меня была такая же проблема при использовании плагина CMB, я решил её, добавив пользовательскую функцию в functions.php
для получения ID изображения по его URL:
functions.php
function cmb_get_image_id($image_src) {
global $wpdb;
$image = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_src ));
return $image[0]; // возвращаем ID изображения
}
В вашей теме:
$my_image = get_post_meta($post->ID, '_my_image_metabox', false);
$attachment_id = cmb_get_image_id($my_image);
wp_get_attachment_image_src($attachment_id, 'desired-size');

В таких случаях я сохраняю ID во скрытом поле ввода вместе с URL.
function meta_image_upload() {
global $post;
$my_image = get_post_meta($post->ID, '_my_image_metabox', true);
$my_image_id = get_post_meta($post->ID, '_my_image_id_metabox', true);
$out = '<input id="my_image" type="text" name="my_uploaded_image" value="'. $my_image .'">';
$out .= '<input id="my_image_id" type="hidden" name="my_uploaded_image_id" value="'. $my_image_id .'">';
$out .= '<button id="my_image_upload">Загрузить изображение</button>';
echo $out;
}
В обработчике загрузки:
attachment = custom_uploader.state().get('selection').first().toJSON();
$('#my_image').val(attachment.url);
$('#my_image_id').val(attachment.id); // Просто добавить эту строку
Затем в других обработчиках:
global $post;
$my_image_id = get_post_meta($post->ID, '_my_image_id_metabox', true);
wp_get_attachment_image_src($my_image_id, 'desired-size');
Это просто моё решение, и кто-то может предложить лучшее. Однако я обнаружил, что это быстрее, чем запрашивать базу данных для получения связанного ID вложения.

Попробуйте это:
$attachment_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT wposts.ID
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wpostmeta.meta_key = '_wp_attached_file'
AND wpostmeta.meta_value = '%s'
AND wposts.post_type = 'attachment'",
$url
)
);
