Как получить attachment_id?

31 окт. 2014 г., 02:49:06
Просмотры: 39.4K
Голосов: 9

Это тривиальная задача, но я не могу найти ответ, я видел некоторые подсказки вроде поиска в базе данных и т.д., но это безумие.

В основном, у меня есть метабокс с кнопкой загрузки, которая позволяет загружать или выбирать существующее изображение из Медиатеки, вот как я получаю 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.

6
Комментарии

Вероятно, у метабокса нет связанного ID вложения, если вы его не добавили. $my_image — это просто строка. Установите get_post_meta в false и проверьте, что он возвращает на самом деле.

Wyck Wyck
31 окт. 2014 г. 02:54:10

Пожалуйста, обновите вопрос и покажите нам, как вы сохраняете данные. Тогда их получение должно быть довольно простым.

kaiser kaiser
31 окт. 2014 г. 04:06:33

Спасибо, вопрос обновлен :) Хотя мне здесь не нужен attachment_id, мне просто нужно получить правильный размер для изображения, добавленного в метабокс (оно находится в Медиабиблиотеке, поэтому имеет миниатюры), но думаю, это единственный способ (кроме регулярных выражений).

Wordpressor Wordpressor
31 окт. 2014 г. 16:28:35

Есть Преобразование URL в ID вложения / записи, что может быть полезно. Помимо этого, вам придется явно сохранять ID, как сказал @Wyck.

Nicolai Grossherr Nicolai Grossherr
31 окт. 2014 г. 16:34:43

Я работаю над этим уже довольно долго и интересуюсь — как я могу получить правильный ID здесь?

Wordpressor Wordpressor
23 нояб. 2014 г. 21:32:05

если вы находитесь внутри цикла на странице вложения, простой get_the_ID() сработает.

Fabien Snauwaert Fabien Snauwaert
17 мар. 2019 г. 01:02:57
Показать остальные 1 комментариев
Все ответы на вопрос 6
1
13

Хорошо, все эти гиперсложные функции можно свести к одной простой команде: attachment_url_to_postid

Вам нужно просто разобрать URL изображения, чтобы получить ID вложения:

<?php

   $attachment_id = attachment_url_to_postid( $image_url );
   echo $attachment_id;

?>

Это всё, что вам нужно.

1 нояб. 2015 г. 09:03:13
Комментарии

Это, БЕЗУСЛОВНО, лучший ответ. Причина в том, что никакие другие функции, такие как url_to_postid или get_page_by_path, не вернут ID, если медиафайл прикреплен к записи.

SlickRemix SlickRemix
8 янв. 2022 г. 21:15:29
0

Я опоздал с ответом на этот вопрос, но это сработает.

$attachment_id = get_post_thumbnail_id( $post->ID );
$url = wp_get_attachment_image_src($attachment_id, 'desired-size');
15 июл. 2020 г. 23:31:29
0

У меня была такая же проблема при использовании плагина 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');
9 апр. 2015 г. 19:04:33
0

В таких случаях я сохраняю 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 вложения.

9 сент. 2015 г. 10:00:43
0

Вся сохраняемая пост-мета информация прикрепляется к записи типа attachment, поэтому можно считать, что $post->ID — это ID вложения.

9 сент. 2015 г. 09:18:15
1
-1

Попробуйте это:

$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
    ) 
);
9 сент. 2015 г. 09:08:20
Комментарии

Пожалуйста, объясните, что делает ваш код и как он работает. Также отформатируйте ваш код, он нечитаем

Pieter Goosen Pieter Goosen
9 сент. 2015 г. 09:40:36