Verificare se un file è già nella Libreria Media

26 ott 2012, 17:16:38
Visualizzazioni: 18.3K
Voti: 10

Sto creando file personalizzati in un plugin e li aggiungo alla Libreria Media utilizzando il codice fornito nel Codex di WordPress per wp_insert_attachment. Tuttavia, il mio plugin occasionalmente sovrascrive questi file. Devo assicurarmi che i file non vengano aggiunti nuovamente alla Libreria Media. Ecco il codice attuale:

$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
   'guid' => $wp_upload_dir['baseurl'] . '/' . _wp_relative_upload_path( $filename ), 
   'post_mime_type' => $wp_filetype['type'],
   'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
   'post_content' => '',
   'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $filename);
// devi prima includere il file image.php
// affinché la funzione wp_generate_attachment_metadata() funzioni
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );

Ho solo bisogno di verificare se il file fa già parte della Libreria Media e, in tal caso, aggiornarlo. Non ho un post_id con cui lavorare, solo il permalink e il guid.

Grazie per il tuo aiuto.

0
Tutte le risposte alla domanda 6
0
global $wpdb;
$image_src = wp_upload_dir()['baseurl'] . '/' . _wp_relative_upload_path( $filename );
$query = "SELECT COUNT(*) FROM {$wpdb->posts} WHERE guid='$image_src'";
$count = intval($wpdb->get_var($query));

Puoi utilizzare questo codice all'inizio del tuo script. Poi controlla il valore di $count. Se è 0, allora puoi procedere con l'aggiunta dell'allegato

26 ott 2012 17:36:54
0

Ho questo metodo (grazie Mridul):

function MediaFileAlreadyExists($filename){
    global $wpdb;
    $query = "SELECT COUNT(*) FROM {$wpdb->postmeta} WHERE meta_value LIKE '%/$filename'";
    return ($wpdb->get_var($query)  > 0) ;
}

// MediaFileAlreadyExists("my-image.png");
27 feb 2017 00:11:33
0

So che questa è una domanda vecchia ma non mi piaceva nessuna delle risposte esistenti, quindi ecco la mia soluzione.

Questo codice verificherà se il file esiste. Se esiste, aggiornerà l'allegato esistente; altrimenti, creerà un nuovo allegato.

// Ottieni la directory di upload
$upload_dir    = wp_upload_dir();
$upload_folder = $upload_dir['path'];

// Imposta il nome del file, incluso il percorso
$filename = "{$upload_folder}/myfile-{$id}.pdf";

// Controlla il tipo di file. Lo useremo come 'post_mime_type'.
$filetype = wp_check_filetype( basename( $filename ), null );

// Ottieni il titolo del file
$title = preg_replace( '/\.[^.]+$/', '', basename( $filename ) );

// Prepara un array di dati per l'allegato
$attachment_data = array(
    'guid'           => $upload_dir['url'] . '/' . basename( $filename ),
    'post_mime_type' => $filetype['type'],
    'post_title'     => $title,
    'post_content'   => '',
    'post_status'    => 'inherit'
);

// L'allegato esiste già?
if( post_exists( $title ) ){
  $attachment = get_page_by_title( $title, OBJECT, 'attachment');
  if( !empty( $attachment ) ){
    $attachment_data['ID'] = $attachment->ID;
  }
}

// Se non è impostato un ID genitore, reimposta al valore predefinito (0)
if( empty( $parent_id ) ){
  $parent_id = 0;
}

// Inserisci l'allegato
$attach_id = wp_insert_attachment( $attachment_data, $filename, $parent_id );

// Genera i metadati per l'allegato e aggiorna il record nel database
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );

Nell'esempio sopra sto usando un file .pdf nella variabile $filename ma puoi sostituirlo con qualsiasi nomefile/tipodifile.

6 dic 2018 17:43:24
2

Puoi verificare se un'immagine esiste con post_exists($filename). Se l'immagine esiste puoi aggiornarla oppure puoi crearla

//se l'immagine esiste aggiorna altrimenti creala
        if (post_exists($filename)){
                $page = get_page_by_title($filename, OBJECT, 'attachment');
                $attach_id = $page->ID;

                $attach_data = wp_generate_attachment_metadata( $attach_id, $destination ); // Genera i metadati dell'allegato, dimensione del file, altezza, larghezza ecc.

                wp_update_attachment_metadata( $attach_id, $attach_data ); // Aggiungi i metadati sopra indicati

                add_post_meta($attach_id, '_wp_attachment_image_alt', $filealt); // Aggiungi il testo alternativo 
        }
        else{

                $attach_id = wp_insert_attachment( $attachment, $destination, $post_id ); 

                $attach_data = wp_generate_attachment_metadata( $attach_id, $destination ); 

                wp_update_attachment_metadata( $attach_id, $attach_data ); 

                add_post_meta($attach_id, '_wp_attachment_image_alt', $filealt); 
            }
10 nov 2017 12:50:17
Commenti

Potresti aggiungere una spiegazione nella risposta su come funziona il codice?

kero kero
10 nov 2017 12:57:16

post_exists restituisce automaticamente l'ID del post se il post esiste, quindi non c'è motivo di usare get_page_by_title() https://developer.wordpress.org/reference/functions/post_exists/

Uriahs Victor Uriahs Victor
4 dic 2020 23:41:04
0

Non l'ho ancora provato, ma dovrebbe essere semplice così:

post_exists( $filename, '', '', 'attachment' );

Restituisce l'ID del post (int) se esiste, altrimenti 0.

14 gen 2021 04:22:42
1

questa funzione prende come parametro il nome del file multimediale e restituisce il meta_id se esiste, altrimenti restituisce (false).

function MediaFileAlreadyExists($filename){
    global $wpdb;
    $query = "SELECT meta_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%/$filename'";

    if ( $wpdb->get_var($query) ){
        return $wpdb->get_var($query);
    }

    return false;
}
17 lug 2017 14:57:17
Commenti

Mi piace l'uso del LIKE. Quando WordPress carica un duplicato, aggiunge un -x al nome del file. Alcuni plugin antepongono una chiave unica per prevenire i duplicati (Media Cloud). post_exists($filename) non rileverà questo. Modificherò il tuo codice per gestire sia il prefisso che il suffisso di $basename. Grazie.

StephenFeather StephenFeather
14 mar 2023 14:05:04