Vérifier si un fichier est déjà dans la médiathèque

8

Je crée des fichiers personnalisés dans un plugin et les ajoute à la médiathèque en utilisant le code fourni dans le Codex Wordpress pour wp_insert_attachment. Cependant, mon plugin écrase parfois ces fichiers. Je dois m'assurer que les fichiers ne sont pas ajoutés à nouveau à la bibliothèque multimédia. Voici le code actuel:

$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);
// you must first include the image.php file
// for the function wp_generate_attachment_metadata() to work
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 );

J'ai juste besoin de vérifier si le fichier fait déjà partie de la médiathèque et de le mettre à jour s'il l'est. Je n'ai pas de post_id avec lequel travailler, juste le permalien et le guid.

Merci de votre aide.

Dawson Goodell
la source

Réponses:

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

Vous pouvez l'utiliser en haut de votre code. Vérifiez ensuite la valeur de $count. Si c'est 0, vous pouvez continuer à ajouter la pièce jointe

Mridul Aggarwal
la source
2

Je sais que c'est une vieille question mais je n'ai aimé aucune de ces réponses alors voici ma solution.

Cela vérifiera si le fichier existe. Si tel est le cas, il mettra à jour la pièce jointe existante; sinon, il créera une nouvelle pièce jointe.

// Get upload dir
$upload_dir    = wp_upload_dir();
$upload_folder = $upload_dir['path'];

// Set filename, incl path
$filename = "{$upload_folder}/myfile-{$id}.pdf";

// Check the type of file. We'll use this as the 'post_mime_type'.
$filetype = wp_check_filetype( basename( $filename ), null );

// Get file title
$title = preg_replace( '/\.[^.]+$/', '', basename( $filename ) );

// Prepare an array of post data for the attachment.
$attachment_data = array(
    'guid'           => $upload_dir['url'] . '/' . basename( $filename ),
    'post_mime_type' => $filetype['type'],
    'post_title'     => $title,
    'post_content'   => '',
    'post_status'    => 'inherit'
);

// Does the attachment already exist ?
if( post_exists( $title ) ){
  $attachment = get_page_by_title( $title, OBJECT, 'attachment');
  if( !empty( $attachment ) ){
    $attachment_data['ID'] = $attachment->ID;
  }
}

// If no parent id is set, reset to default(0)
if( empty( $parent_id ) ){
  $parent_id = 0;
}

// Insert the attachment.
$attach_id = wp_insert_attachment( $attachment_data, $filename, $parent_id );

// Generate the metadata for the attachment, and update the database record.
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );

Dans l'exemple ci-dessus, j'utilise un .pdf dans mon $ filename mais vous pouvez le remplacer par n'importe quel nom de fichier / type de fichier.

Lennart
la source
1

J'ai cette méthode (merci 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");
T.Todua
la source
0

cette fonction prend en paramètre le nom du fichier multimédia, et retourne le meta_id s'il existe, sinon il retourne (faux).

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;
}
martelé
la source
0

Vous pouvez vérifier si l'image existe avec post_exists($filename). Si l'image existe, vous pouvez la mettre à jour, vous pouvez également la créer

 //if image exist update else create it
        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 ); // Generate attachment data, filesize, height, width etc.

                wp_update_attachment_metadata( $attach_id, $attach_data ); // Add the above meta data

                add_post_meta($attach_id, '_wp_attachment_image_alt', $filealt); // Add the alt text 
        }
        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); 
            }
Altravista
la source
1
Pourriez-vous ajouter une explication dans la réponse sur le fonctionnement du code?
kero