Come ottengo l'attachment_id?
È una cosa banale, ma non riesco davvero a trovare una risposta. Ho visto alcuni suggerimenti come cercare nel database ecc., ma è una follia.
In pratica, ho un metabox con un pulsante di caricamento che consente di caricare o selezionare un'immagine esistente dalla Libreria Media, ecco come ottengo l'URL di questa immagine:
$my_image = get_post_meta($post->ID, '_my_image_metabox', true);
Ovviamente voglio che venga visualizzata l'esatta dimensione di questa immagine quindi devo usare:
wp_get_attachment_image_src($attachment_id, 'desired-size');
La domanda è come ottengo l'attachment_id
di _my_image_metabox
? Ho cercato letteralmente ovunque e non ci sono risposte sensate, come si suppone che funzioni wp_get_attachment_image_src()
se non c'è una singola riga su come ottenere $attachment_id
nel Codex? :)
[aggiornamento]
var_dump($my_image)
restituisce:
array(1) { [0]=> string(86) "http://localhost/theme/wp-content/uploads/2014/10/my_image.jpg" }
Il salvataggio dei dati è piuttosto complicato poiché uso la mia classe di generazione metabox personalizzata, qualcosa del genere: https://github.com/nyordanov/SmartMetaBox/blob/master/SmartMetaBox.php
Come posso quindi iniettare il corretto attachment_id in my_image? Aggiungo che ho diversi (10) campi come questo e vorrei che ognuno avesse un attachment_id separato e univoco.
Ok, tutte quelle funzioni ipercomplesse possono essere ridotte a un semplice comando: attachment_url_to_postid
Ti basta analizzare l'URL dell'immagine per ottenere l'ID dell'allegato:
<?php
$attachment_id = attachment_url_to_postid( $image_url );
echo $attachment_id;
?>
È tutto ciò che ti serve.

Avevo lo stesso problema mentre utilizzavo il plugin CMB, ho risolto aggiungendo una funzione personalizzata a functions.php
per ottenere l'ID dell'immagine utilizzando l'URL dell'immagine:
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]; //ritorna l'ID dell'immagine
}
Nel tuo 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');

Quello che faccio in questi casi è salvare l'ID in un campo input nascosto insieme all'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">Carica Immagine</button>';
echo $out;
}
Nello script di gestione del caricamento:
attachment = custom_uploader.state().get('selection').first().toJSON();
$('#my_image').val(attachment.url);
$('#my_image_id').val(attachment.id); // Aggiungi semplicemente questa riga
Poi negli altri callback:
global $post;
$my_image_id = get_post_meta($post->ID, '_my_image_id_metabox', true);
wp_get_attachment_image_src($my_image_id, 'dimensione-desiderata');
Questa è semplicemente la mia soluzione e qualcuno potrebbe trovarne una migliore. Tuttavia, l'ho trovata più veloce rispetto all'interrogazione del database per recuperare l'ID dell'allegato associato.

Prova con questo:
$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
)
);
