web-dev-qa-db-fra.com

Comment puis-je obtenir attachment_id?

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.

3
Wordpressor

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.

3
Ego Ipse

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é.

1
Abhik

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:

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]; //return the image ID
}

Dans votre thème:

$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');
1
Tomás Ramírez

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.

0
Ahir Hemant