C'est trivial, mais je ne trouve pas vraiment de réponse, j'ai déjà vu des astuces telles que la recherche dans une base de données, etc., mais c'est de la folie.
Fondamentalement, j'ai une metabox avec un bouton de téléchargement qui vous permet de télécharger ou de sélectionner une image existante dans la bibliothèque multimédia, voici comment obtenir l'URL de cette image:
$my_image = get_post_meta($post->ID, '_my_image_metabox', true);
Bien sûr, je veux que la taille exacte de cette image soit affichée, donc je dois utiliser:
wp_get_attachment_image_src($attachment_id, 'desired-size');
La question est de savoir comment obtenir attachment_id
de _my_image_metabox
? J'ai cherché littéralement partout et il n'y a pas de réponses sensées. Comment wp_get_attachment_image_src()
est-il censé fonctionner s'il n'y a pas une seule ligne pour obtenir $attachment_id
dans le Codex? :)
[mise à jour]
var_dump($my_image)
renvoie:
array(1) { [0]=> string(86) "http://localhost/theme/wp-content/uploads/2014/10/my_image.jpg" }
L'enregistrement des données est assez compliqué car j'utilise ma propre classe génératrice Metabox, comme suit: https://github.com/nyordanov/SmartMetaBox/blob/master/SmartMetaBox.php
Comment puis-je injecter le attachment_id approprié à mon_image alors? J'ajouterais que j'ai plusieurs (10) champs comme celui-ci et j'aimerais que chacun d'entre eux ait un attachement_id distinct et unique.
Ok, toutes ces fonctions hipercomplexes peuvent être réduites à une simple commande: attachment_url_to_postid
Il suffit d’analyser l’URL de l’image pour récupérer l’identifiant de la pièce jointe:
<?php
$attachment_id = attachment_url_to_postid( $image_url );
echo $attachment_id;
?>
C'est tout ce dont vous avez besoin.
Ce que je fais dans de tels cas dans lequel enregistre l'ID dans une entrée masquée avec l'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">Upload Image</button>';
echo $out;
}
Sur le script du gestionnaire de téléchargement:
attachment = custom_uploader.state().get('selection').first().toJSON();
$('#my_image').val(attachment.url);
$('#my_image_id').val(attachment.id); // Just add this line
Puis à d'autres rappels:
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');
C'est juste ma solution et quelqu'un pourrait en proposer une meilleure. Cependant, j'ai trouvé plus rapide que d'interroger la base de données d'extraire l'identifiant de pièce jointe associé.
J'avais le même problème lorsque j'utilisais le plugin CMB, j'ai résolu d'ajouter une fonction personnalisée à functions.php
pour obtenir l'ID de l'image à l'aide de l'URL de l'image:
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]; //return the image 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');
Toutes les méta-publications que vous enregistrez sont attachées à une publication de type pièce jointe. Vous pouvez donc considérer que $post->ID
est l'ID de la pièce jointe.