Cum obțin attachment_id?
Este ceva trivial, dar nu pot găsi cu adevărat un răspuns, am văzut câteva indicii cum ar fi căutarea în baza de date etc., dar este o nebunie.
Practic, am un metabox cu buton de încărcare care îți permite să încarci sau să alegi o imagine existentă din Biblioteca Media, așa obțin URL-ul acestei imagini:
$my_image = get_post_meta($post->ID, '_my_image_metabox', true);
Bineînțeles că vreau să afișez dimensiunea exactă a acestei imagini, așa că trebuie să folosesc:
wp_get_attachment_image_src($attachment_id, 'desired-size');
Întrebarea este cum obțin attachment_id
al _my_image_metabox
? Am căutat literalmente peste tot și nu există răspunsuri rezonabile, cum este wp_get_attachment_image_src()
presupus să funcționeze dacă nu există nicio singură linie despre obținerea $attachment_id
în Codex? :)
[actualizat]
var_dump($my_image)
returnează:
array(1) { [0]=> string(86) "http://localhost/theme/wp-content/uploads/2014/10/my_image.jpg" }
Salvarea datelor este destul de complicată deoarece folosesc propria mea clasă de generare metabox, ceva de genul: https://github.com/nyordanov/SmartMetaBox/blob/master/SmartMetaBox.php
Cum injectez attachment_id-ul potrivit în my_image atunci? Aș adăuga că am multiple (10) câmpuri ca acesta și aș dori ca fiecare să aibă attachment_id separat, unic.

Bine, toate acele funcții hipercomplexe pot fi reduse la o singură comandă simplă: attachment_url_to_postid
Trebuie doar să analizezi URL-ul imaginii pentru a obține ID-ul atașamentului:
<?php
$attachment_id = attachment_url_to_postid( $image_url );
echo $attachment_id;
?>
Asta e tot ce ai nevoie.

Am avut aceeași problemă în timp ce foloseam plugin-ul CMB, am rezolvat-o adăugând o funcție personalizată în functions.php
pentru a obține ID-ul imaginii folosind URL-ul acesteia:
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]; //returnează ID-ul imaginii
}
În tema ta:
$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, 'dimensiunea-dorita');

Ceea ce fac eu în astfel de cazuri este să salvez ID-ul într-un câmp input hidden împreună cu URL-ul.
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">Încarcă imagine</button>';
echo $out;
}
În scriptul de încărcare:
attachment = custom_uploader.state().get('selection').first().toJSON();
$('#my_image').val(attachment.url);
$('#my_image_id').val(attachment.id); // Doar adaugă această linie
Apoi în alte callback-uri:
global $post;
$my_image_id = get_post_meta($post->ID, '_my_image_id_metabox', true);
wp_get_attachment_image_src($my_image_id, 'dimensiune-dorită');
Aceasta este doar soluția mea și cineva ar putea veni cu una mai bună. Totuși, am constatat că este mai rapidă decât interogarea bazei de date pentru a obține ID-ul atașamentului asociat.

Încearcă cu aceasta:
$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
)
);
