Cum să găsești un atașament după numele său?

8 oct. 2013, 08:57:06
Vizualizări: 38.5K
Voturi: 6

Este posibil să obții ID-ul unui atașament după numele său? Și totodată, este posibil să obții postarea părinte de care este asociat acest atașament?

4
Comentarii

@Wyck, pur și simplu nu am putut găsi nicio funcție pentru a găsi un fișier după numele său.

Kirix Kirix
8 oct. 2013 09:16:50

Susțin ce a spus Wyck, pentru că dacă cauți pe Google "wordpress get attachment id from guid" sau "wordpress get attachment id from name" găsești mai multe soluții.

helgatheviking helgatheviking
8 oct. 2013 12:04:17

@helgatheviking și ai încercat sau doar ai căutat pe Google?

Kirix Kirix
8 oct. 2013 13:28:34

Nu, nu am încercat. Ideea mea era că Wyck a întrebat ce ai încercat și că există o mulțime de funcții pe care le poți testa. Dacă ne poți spune ce ai încercat și exact ce nu funcționează, te putem ajuta să ajustezi soluția. De asemenea, firele de discuții de suport precum http://wordpress.org/support/topic/need-to-get-attachment-id-by-image-url sunt marcate ca rezolvate, deci cineva trebuie să fi considerat soluția valabilă.

helgatheviking helgatheviking
8 oct. 2013 13:45:23
Toate răspunsurile la întrebare 6
8
12

Trebuie să scrii cod personalizat pentru a obține ID-ul atașamentului și post_parent după nume/ slug sau numele fișierului (dacă acesta nu a fost modificat în timpul încărcării fișierelor).

Pune următorul cod în fișierul functions.php al temei tale

if( ! ( function_exists( 'wp_get_attachment_by_post_name' ) ) ) {
    function wp_get_attachment_by_post_name( $post_name ) {
            $args           = array(
                'posts_per_page' => 1,
                'post_type'      => 'attachment',
                'name'           => trim( $post_name ),
            );

            $get_attachment = new WP_Query( $args );

            if ( ! $get_attachment || ! isset( $get_attachment->posts, $get_attachment->posts[0] ) ) {
                return false;
            }

            return $get_attachment->posts[0];
    }
}

apoi poți apela funcția unde ai nevoie de ea astfel:--

$attachment = wp_get_attachment_by_post_name( $post_name );
// Înlocuiește post_name cu numele/slug-ul atașamentului
// Va returna un obiect, pe care îl poți afișa astfel pentru a obține ID-ul și post_parent
if ( $attachment ) {
    echo $attachment->ID; // Returnează ID-ul atașamentului
    echo $attachment->post_parent; // Returnează ID-ul post_parent
    echo $attachment->post_title; // Returnează titlul atașamentului.
}
8 oct. 2013 11:34:09
Comentarii

nu am numele postării, am doar numele fișierului

Kirix Kirix
8 oct. 2013 11:50:07

ok, prin nume am crezut că e numele postării

Maruti Mohanty Maruti Mohanty
8 oct. 2013 12:06:38

Poți încerca să folosești numele fișierului în loc de post_name ca parametru, deoarece WordPress creează slug-ul pentru atașament folosind numele fișierului până când acesta este modificat manual.

Maruti Mohanty Maruti Mohanty
8 oct. 2013 12:46:20

nu funcționează....

user1692333 user1692333
8 oct. 2013 22:57:35

@user1692333 Poți să explici situația în care acest fragment de cod nu funcționează? Hai să-l facem să funcționeze

Maruti Mohanty Maruti Mohanty
9 oct. 2013 08:38:01

am făcut-o într-un mod mai simplu, am folosit wp_query cu căutare și am obținut de acolo ID-ul postării.

user1692333 user1692333
10 oct. 2013 00:14:24

@user1692333 Super!!! De ce nu postezi ce ai făcut?

Maruti Mohanty Maruti Mohanty
17 oct. 2013 09:51:24

folosirea namespace-ului wp_ pentru funcții care nu aparțin WordPress este o practică proastă

Toskan Toskan
12 oct. 2016 23:10:07
Arată celelalte 3 comentarii
0

O altă abordare posibilă este utilizarea directă a $wpdb pentru a face o interogare SQL, în tabelul de postări, cu titlul postării căutate și cu post_type "attachment".

function get_attachment_url_by_title( $title ) {
    global $wpdb;

    $attachments = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_title = '$title' AND post_type = 'attachment' ", OBJECT );
    //print_r($attachments);
    if ( $attachments ){

        $attachment_url = $attachments[0]->guid;

    }else{
        return 'image-not-found';
    }

    return $attachment_url;
}
// utilizare:
get_attachment_url_by_title('your_image_title');

Țineți cont că acest cod va returna primul atașament cu acest titlu.


Alternativă, fără interogare SQL. Mai bine în majoritatea cazurilor:

function get_attachment_url_by_title( $title ) {

$attachment = get_page_by_title($title, OBJECT, 'attachment');
//print_r($attachment);

  if ( $attachment ){

    $attachment_url = $attachment->guid;

  }else{
    return 'image-not-found';
  }

  return $attachment_url;
}

echo get_attachment_url_by_title('your_image_title');
29 aug. 2016 17:45:52
0

get_page_by_title() va funcționa.

Cu un URL complet ca titlu:

get_page_by_title( pathinfo( 'https://www.example.com/file.jpg' )['filename'], "OBJECT", 'attachment' );

Returnează un obiect WP_Post sau Null, dacă nu au fost găsite postări/atașamente.

12 mar. 2018 14:59:43
0

Conform WordPress Codex,

'attachment' - un atașament. În timp ce post_status implicit în WP_Query este 'publish', atașamentele au un post_status implicit de 'inherit'. Aceasta înseamnă că nicio atașare nu va fi returnată decât dacă setați explicit post_status la 'inherit' sau 'any'. (Vezi post_status, mai jos)

31 dec. 2016 06:39:17
3

Tocmai am petrecut câteva ore încercând să rezolv această problemă. Există un nume de fișier pe care funcția get_page_by_title nu l-a putut găsi. @Snade Am adaptat răspunsul lui pentru nevoile mele.

Am doar numele fișierului și am nevoie să obțin URL-ul imaginii din biblioteca media. Snade a fost foarte aproape, dar chiar și așa, funcția lui nu a funcționat în circumstanțele mele. Funcția pe care a furnizat-o m-a îndreptat în direcția bună.

Această soluție o voi testa, dar pare să funcționeze. Practic, tot ce caut este numele fișierului în guid. Deoarece titlul a eliminat extensia și a transformat spațiile, nu am putut găsi această imagine în alt mod.

Mă apuc de teste suplimentare...

/**
 * Obține URL-ul unui atașament din baza de date WordPress bazat pe numele fișierului (GUID)
 * @param string $filename Numele fișierului (fără cale)
 * @return string URL-ul imaginii sau 'image-not-found' dacă nu este găsită
 */
function get_attachment_url_by_guid( $filename ) {
        global $wpdb;

        // Extensii de fișiere acceptate
        $ext = array(".png", ".jpg", ".gif", ".jpeg");
        // Eliminăm extensia din nume
        $filename = str_replace($ext, "", $filename);
        // Curăță numele fișierului: elimină caractere speciale, convertește spații etc.
        $clean_filename = trim(html_entity_decode(sanitize_title($filename)));

        // Caută în baza de date fișiere atașament care conțin numele curățat în GUID
        $attachments = $wpdb->get_results( "SELECT guid FROM $wpdb->posts WHERE guid LIKE '%$clean_filename%' AND post_type = 'attachment' ", OBJECT );
        
        // Dacă s-au găsit rezultate, returnează primul URL găsit
        if ( $attachments ){    
            $attachment_url = $attachments[0]->guid;    
        }else{
            return 'image-not-found'; // Dacă nu este găsită imaginea
        }   
        return $attachment_url;
}
4 sept. 2020 06:25:39
Comentarii

Ar fi mai bine să folosești $wpdb->prepare pentru interogarea get_results @Robbiegod

Tami Tami
20 ian. 2021 23:22:43

ai dreptate! @Tami Dar acest cod este doar în interiorul unui plugin care nu este distribuit. Doar un plugin personalizat pentru site-ul meu. Îl voi actualiza în viitor. Bună observație.

Robbiegod Robbiegod
9 feb. 2021 18:39:38

Corect spus @Robbiegod! Am găsit răspunsul tău util și eu :)

Tami Tami
11 feb. 2021 02:58:11
0

Am fost nevoit să petrec prea mult timp pe această problemă, deoarece unele dintre soluțiile de mai sus funcționează în anumite situații, dar nu în altele. Problema principală apare pentru fișierele atașate încărcate cu o rezoluție mai mare de 2560px. WordPress adaugă '-scaled' la numele fișierului returnat de get_attached_file(), dar acest lucru nu se reflectă în coloana guid din baza de date.

În final, am urmărit codul funcției get_attached_file() și am realizat următoarea soluție:

function get_attachment_id_by_filename($filename) {
    global $wpdb;
    $attachments = $wpdb->get_results("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attached_file' AND meta_value like'%$filename'", OBJECT);
    return $attachments[0]->post_id ?? false;}
26 apr. 2022 08:13:31