¿Cómo obtengo el attachment_id?
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.
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.

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');

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.

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
)
);
