Cum obțin attachment_id?

31 oct. 2014, 02:49:06
Vizualizări: 39.4K
Voturi: 9

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.

6
Comentarii

Probabil că meta box-ul nu are un ID de atașament asociat decât dacă îl adăugați manual, $my_image este doar un șir de caractere. Setați get_post_meta la false și verificați ce returnează de fapt.

Wyck Wyck
31 oct. 2014 02:54:10

Actualizați întrebarea și arătați-ne cum salvați datele. Preluarea ar trebui să fie destul de ușoară după aceea.

kaiser kaiser
31 oct. 2014 04:06:33

Mulțumesc, întrebarea a fost actualizată :) Nu am nevoie să am un attachment_id aici, trebuie doar să obțin dimensiunea corectă pentru imaginea adăugată în metabox (se află în Media Library deci are thumbnail-uri generate), dar cred că asta e singura metodă (în afară de regexp).

Wordpressor Wordpressor
31 oct. 2014 16:28:35

Există Transformă un URL într-un Atașament / ID Post, care ar putea fi util. În afară de asta, ar trebui să salvezi explicit ID-ul, cum a spus @Wyck.

Nicolai Grossherr Nicolai Grossherr
31 oct. 2014 16:34:43

Am lucrat la asta de ceva timp și mă întreb - cum pot obține ID-ul corect aici?

Wordpressor Wordpressor
23 nov. 2014 21:32:05

dacă ești în bucla pe o pagină de atașament, un simplu get_the_ID() va funcționa.

Fabien Snauwaert Fabien Snauwaert
17 mar. 2019 01:02:57
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 6
1
13

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.

1 nov. 2015 09:03:13
Comentarii

Acesta este DE departe cel mai bun răspuns. Motivul este că nicio altă funcție precum url_to_postid sau get_page_by_path nu va returna un ID dacă media este atașată unui articol.

SlickRemix SlickRemix
8 ian. 2022 21:15:29
0

Sunt prea târziu să răspund la această întrebare, dar va funcționa.

$attachment_id = get_post_thumbnail_id( $post->ID );
$url = wp_get_attachment_image_src($attachment_id, 'desired-size');
15 iul. 2020 23:31:29
0

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');
9 apr. 2015 19:04:33
0

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.

9 sept. 2015 10:00:43
0

Toate metadatele postării pe care le salvezi sunt atașate unei postări de tip atașament, așa că poți considera că $post->ID este ID-ul atașamentului.

9 sept. 2015 09:18:15
1
-1

Î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
    ) 
);
9 sept. 2015 09:08:20
Comentarii

Te rog să explici ce face codul tău și cum funcționează. De asemenea, formatează-ți codul, este greu de citit

Pieter Goosen Pieter Goosen
9 sept. 2015 09:40:36