Come trovare un allegato tramite il suo nome?

8 ott 2013, 08:57:06
Visualizzazioni: 38.5K
Voti: 6

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

4
Commenti

@Wyck, semplicemente non sono riuscito a trovare alcuna funzione per trovare un file per nome.

Kirix Kirix
8 ott 2013 09:16:50

Faccio eco a Wyck, perché cercando su Google "wordpress get attachment id from guid" o "wordpress get attachment id from name" si trovano diverse soluzioni.

helgatheviking helgatheviking
8 ott 2013 12:04:17

@helgatheviking e l'hai provato o hai solo fatto una ricerca su Google?

Kirix Kirix
8 ott 2013 13:28:34

No, non ho provato. Il mio punto era che Wyck ha chiesto cosa hai provato e che ci sono molte funzioni disponibili da testare. Se puoi dirci cosa hai provato e precisamente cosa non funziona, possiamo aiutarti a modificarlo. Inoltre, thread di supporto come http://wordpress.org/support/topic/need-to-get-attachment-id-by-image-url sono contrassegnati come risolti, quindi qualcuno deve aver pensato che la soluzione fosse valida.

helgatheviking helgatheviking
8 ott 2013 13:45:23
Tutte le risposte alla domanda 6
8
12

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.
}
8 ott 2013 11:34:09
Commenti

non ho il nome del post, ho solo il nome del file

Kirix Kirix
8 ott 2013 11:50:07

ok, per nome pensavo fosse il nome del post

Maruti Mohanty Maruti Mohanty
8 ott 2013 12:06:38

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.

Maruti Mohanty Maruti Mohanty
8 ott 2013 12:46:20

non funziona....

user1692333 user1692333
8 ott 2013 22:57:35

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

Maruti Mohanty Maruti Mohanty
9 ott 2013 08:38:01

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 user1692333
10 ott 2013 00:14:24

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

Maruti Mohanty Maruti Mohanty
17 ott 2013 09:51:24

usare il namespace wp_ per funzioni non di WordPress è sbagliato

Toskan Toskan
12 ott 2016 23:10:07
Mostra i restanti 3 commenti
0

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');
29 ago 2016 17:45:52
0

get_page_by_title() farà al caso tuo.

Con un URL completo come titolo:

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

Restituisce un oggetto WP_Post o Null, se non vengono trovati post/allegati.

12 mar 2018 14:59:43
0

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)

31 dic 2016 06:39:17
3

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;
}
4 set 2020 06:25:39
Commenti

Sarebbe meglio usare $wpdb->prepare per la query get_results @Robbiegod

Tami Tami
20 gen 2021 23:22:43

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.

Robbiegod Robbiegod
9 feb 2021 18:39:38

Giusto @Robbiegod! Ho trovato utile anche la tua risposta :)

Tami Tami
11 feb 2021 02:58:11
0

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;}
26 apr 2022 08:13:31