Cum să găsești un atașament după numele său?
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?

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

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.

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

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.

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');

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)

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;
}

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

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.

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;}
