¿Cómo obtengo el attachment_id?

31 oct 2014, 02:49:06
Vistas: 39.4K
Votos: 9

Esto es trivial, pero realmente no puedo encontrar una respuesta. He visto algunas sugerencias como buscar en la base de datos, etc., pero esto es una locura.

Básicamente, tengo un metabox con un botón de subida que permite subir o seleccionar una imagen existente de la Biblioteca de Medios. Así es como obtengo la URL de esta imagen:

$my_image = get_post_meta($post->ID, '_my_image_metabox', true);

Por supuesto, quiero que se muestre el tamaño exacto de esta imagen, así que necesito usar:

wp_get_attachment_image_src($attachment_id, 'desired-size');

La pregunta es ¿cómo obtengo el attachment_id de _my_image_metabox? He estado buscando literalmente en todas partes y no hay respuestas sensatas. ¿Cómo se supone que funciona wp_get_attachment_image_src() si no hay ni una sola línea sobre cómo obtener $attachment_id en el Codex? :)

[actualización]

var_dump($my_image) devuelve:

array(1) { [0]=> string(86) "http://localhost/theme/wp-content/uploads/2014/10/my_image.jpg" }

Guardar los datos es bastante complicado ya que uso mi propia clase generadora de metabox, algo como esto: https://github.com/nyordanov/SmartMetaBox/blob/master/SmartMetaBox.php

¿Cómo inyecto entonces el attachment_id apropiado a my_image? Añadiría que tengo múltiples (10) campos como este y me gustaría que cada uno tuviera un attachment_id separado y único.

6
Comentarios

Probablemente la caja meta no tenga un ID de adjunto asociado a menos que lo agregues, $my_image es solo una cadena. Configura get_post_meta a false y depura lo que realmente retorna.

Wyck Wyck
31 oct 2014 02:54:10

Por favor actualiza la pregunta y muéstranos cómo guardas los datos. La recuperación debería ser bastante fácil entonces.

kaiser kaiser
31 oct 2014 04:06:33

Gracias, pregunta actualizada :) No necesito tener un attachment_id aquí, solo necesito obtener el tamaño adecuado para la imagen agregada a la caja meta (está en la Biblioteca Multimedia por lo que tiene miniaturas propias), pero creo que esa es la única forma (exceptuando expresiones regulares).

Wordpressor Wordpressor
31 oct 2014 16:28:35

Existe Convertir una URL en un Adjunto / ID de Entrada, lo cual podría ser útil. Aparte de eso, tendrías que guardar explícitamente el ID, como mencionó @Wyck.

Nicolai Grossherr Nicolai Grossherr
31 oct 2014 16:34:43

He estado trabajando en esto por bastante tiempo y me pregunto - ¿cómo puedo obtener el ID correcto aquí?

Wordpressor Wordpressor
23 nov 2014 21:32:05

si estás dentro del loop en una página de adjuntos, un simple get_the_ID() funcionará.

Fabien Snauwaert Fabien Snauwaert
17 mar 2019 01:02:57
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 6
1
13

De acuerdo, todas esas funciones hipercomplejas se pueden reducir a un simple comando: attachment_url_to_postid

Solo necesitas analizar la URL de la imagen para obtener el ID del adjunto:

<?php

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

?>

Eso es todo lo que necesitas.

1 nov 2015 09:03:13
Comentarios

Esta es, SIN DUDA, la mejor respuesta. La razón es que ninguna otra función como url_to_postid o get_page_by_path devolverá un ID si el archivo multimedia está adjunto a una publicación.

SlickRemix SlickRemix
8 ene 2022 21:15:29
0

Llego tarde para responder esta pregunta, pero funcionará.

$attachment_id = get_post_thumbnail_id( $post->ID );
$url = wp_get_attachment_image_src($attachment_id, 'tamaño-deseado');
15 jul 2020 23:31:29
0

Tuve el mismo problema mientras usaba el plugin CMB, lo resolví añadiendo una función personalizada al functions.php para obtener el ID de la imagen usando la URL de la imagen:

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]; //retorna el ID de la imagen
}

En tu tema:

$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 abr 2015 19:04:33
0

Lo que hago en estos casos es guardar el ID en un campo oculto junto con la 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">Subir Imagen</button>';

    echo $out;
}  

En el script de manejo de la subida:

attachment = custom_uploader.state().get('selection').first().toJSON();
    $('#my_image').val(attachment.url);
    $('#my_image_id').val(attachment.id); // Solo añade esta línea

Luego, en otras llamadas:

global $post;
$my_image_id = get_post_meta($post->ID, '_my_image_id_metabox', true);
wp_get_attachment_image_src($my_image_id, 'tamaño-deseado');

Esta es solo mi solución y alguien podría proponer una mejor. Sin embargo, encontré que es más rápido que consultar la base de datos para obtener el ID del archivo adjunto asociado.

9 sept 2015 10:00:43
0

Todos los metadatos de la publicación que estás guardando están asociados a una publicación de tipo adjunto, por lo que puedes considerar que $post->ID es el ID del adjunto.

9 sept 2015 09:18:15
1
-1

Prueba con esto:

$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 sept 2015 09:08:20
Comentarios

Por favor, explica qué hace tu código y cómo funciona. También formatea tu código, ya que no es legible

Pieter Goosen Pieter Goosen
9 sept 2015 09:40:36