Come trovare un allegato tramite il suo nome?
È possibile ottenere l'ID di un allegato dal suo nome? E allo stesso tempo, è possibile ottenere il post genitore a cui questo allegato è assegnato?

Devi scrivere del codice personalizzato per ottenere l'ID dell'allegato e il post_parent tramite il nome/slug o il nome del file (se non è stato modificato durante il caricamento dei file).
Inserisci il seguente codice nel file functions.php del tuo tema
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];
}
}
successivamente potrai chiamare la funzione dove ti serve in questo modo:
$attachment = wp_get_attachment_by_post_name( $post_name );
// Sostituisci post_name con il nome/slug dell'allegato
// Ti restituirà un oggetto, che puoi utilizzare come segue per ottenere l'ID e il post_parent
if ( $attachment ) {
echo $attachment->ID; // Restituisce l'ID dell'allegato
echo $attachment->post_parent; // Restituisce l'ID del post_parent
echo $attachment->post_title; // Restituisce il titolo dell'allegato.
}

Puoi provare a usare il nome del file invece del post_name come parametro, dato che WordPress crea lo slug per l'allegato con il nome del file a meno che non venga modificato.

@user1692333 Puoi per favore spiegare la tua situazione in cui questo snippet non funziona? Facciamo in modo che funzioni

l'ho fatto in modo più semplice, ho usato wp_query con la ricerca e poi da lì ho ottenuto l'id del post.

@user1692333 Fantastico!!! Perché non pubblichi quello che hai fatto?

Un altro approccio possibile è utilizzare direttamente $wpdb per eseguire una query SQL, nella tabella dei post, con il titolo del post cercato e con 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;
}
// utilizzo:
get_attachment_url_by_title('titolo_tua_immagine');
Tieni presente che questo codice restituirà il primo allegato con questo titolo.
Metodo alternativo, senza query SQL. Migliore nella maggior parte dei casi:
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('titolo_tua_immagine');

Secondo il WordPress Codex,
'attachment' - un allegato. Mentre il post_status predefinito di WP_Query è 'publish', gli allegati hanno un post_status predefinito di 'inherit'. Ciò significa che nessun allegato verrà restituito a meno che non si imposti esplicitamente post_status su 'inherit' o 'any'. (Vedi post_status, sotto)

Ho appena passato un paio d'ore cercando di risolvere questo esatto problema. C'era un nome di file che get_page_by_title non riusciva a trovare. @Snade Ho adattato la sua risposta per le mie esigenze.
Ho solo il nome del file e ho bisogno di ottenere l'URL dell'immagine dalla libreria media. Snade era molto vicino, ma anche così la sua funzione non funzionava nella mia situazione. La funzione che ha fornito mi ha comunque indirizzato nella giusta direzione.
Questa soluzione la testerò, ma sembra funzionare. Fondamentalmente tutto quello che cerco è il nome del file nel guid. Poiché il titolo aveva rimosso l'estensione e aggiunto spazi, non sono riuscito a trovare questa immagine in nessun altro modo.
Ora farò altri test...
function get_attachment_url_by_guid( $filename ) {
global $wpdb;
$ext = array(".png", ".jpg", ".gif", ".jpeg");
$filename = str_replace($ext, "", $filename);
$clean_filename = trim(html_entity_decode(sanitize_title($filename)));
$attachments = $wpdb->get_results( "SELECT guid FROM $wpdb->posts WHERE guid LIKE '%$clean_filename%' AND post_type = 'attachment' ", OBJECT );
//print_r($attachments);
if ( $attachments ){
$attachment_url = $attachments[0]->guid;
}else{
return 'image-not-found';
}
return $attachment_url;
}

hai proprio ragione! @Tami Ma questo codice è all'interno di un plugin che non viene distribuito. Solo un plugin personalizzato per il mio sito. Lo aggiornerò in futuro. Ottimo punto.

Ho dovuto passare troppo tempo su questo problema poiché alcune delle soluzioni sopra indicate funzionano in alcune situazioni ma non in altre. Il punto critico riguarda gli allegati caricati con una risoluzione maggiore di 2560px. WordPress aggiunge '-scaled' al nome del file restituito da get_attached_file(), ma questo non si riflette nella colonna guid del database.
Alla fine ho analizzato il codice di get_attached_file() e ho ricostruito la seguente soluzione.
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;}
