Verificarea dacă un fișier există deja în Biblioteca Media

26 oct. 2012, 17:16:38
Vizualizări: 18.3K
Voturi: 10

Am creat fișiere personalizate într-un plugin și le adaug în Biblioteca Media folosind codul din Wordpress Codex pentru wp_insert_attachment. Însă, pluginul meu suprascrie ocazional aceste fișiere. Trebuie să mă asigur că fișierele nu sunt adăugate din nou în Biblioteca Media. Iată codul actual:

$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);
// trebuie să incluzi mai întâi fișierul image.php
// pentru ca funcția wp_generate_attachment_metadata() să funcționeze
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 );

Am nevoie să verific dacă fișierul există deja în Biblioteca Media și să-l actualizez dacă există. Nu am un post_id cu care să lucrez, doar permalink-ul și guid-ul.

Mulțumesc pentru ajutor.

0
Toate răspunsurile la întrebare 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));

Puteți utiliza acest cod la începutul scriptului. Apoi verificați valoarea $count. Dacă este 0, atunci puteți continua cu adăugarea atașamentului

26 oct. 2012 17:36:54
0

Am această metodă (mulțumesc 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

Știu că aceasta este o întrebare veche, dar nu mi-a plăcut niciunul dintre răspunsurile așa că iată soluția mea.

Aceasta va verifica dacă fișierul există. Dacă există, va actualiza atașamentul existent; dacă nu, va crea un nou atașament.

// Obține directorul de upload
$upload_dir    = wp_upload_dir();
$upload_folder = $upload_dir['path'];

// Setează numele fișierului, inclusiv calea
$filename = "{$upload_folder}/myfile-{$id}.pdf";

// Verifică tipul fișierului. Îl vom folosi ca 'post_mime_type'.
$filetype = wp_check_filetype( basename( $filename ), null );

// Obține titlul fișierului
$title = preg_replace( '/\.[^.]+$/', '', basename( $filename ) );

// Pregătește un array de date pentru atașament.
$attachment_data = array(
    'guid'           => $upload_dir['url'] . '/' . basename( $filename ),
    'post_mime_type' => $filetype['type'],
    'post_title'     => $title,
    'post_content'   => '',
    'post_status'    => 'inherit'
);

// Atașamentul există deja?
if( post_exists( $title ) ){
  $attachment = get_page_by_title( $title, OBJECT, 'attachment');
  if( !empty( $attachment ) ){
    $attachment_data['ID'] = $attachment->ID;
  }
}

// Dacă nu este setat ID-ul părintelui, resetează la valoarea implicită (0)
if( empty( $parent_id ) ){
  $parent_id = 0;
}

// Inserează atașamentul.
$attach_id = wp_insert_attachment( $attachment_data, $filename, $parent_id );

// Generează metadatele pentru atașament și actualizează înregistrarea în baza de date.
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );

În exemplul de mai sus folosesc un fișier .pdf în variabila $filename, dar poți înlocui acest lucru cu orice nume/tip de fișier.

6 dec. 2018 17:43:24
2

Puteți verifica dacă o imagine există folosind post_exists($filename). Dacă imaginea există, o puteți actualiza sau o puteți crea

//dacă imaginea există, actualizează, altfel creează-o
        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 ); // Generează metadata pentru atașament, dimensiunea fișierului, înălțime, lățime etc.

                wp_update_attachment_metadata( $attach_id, $attach_data ); // Adaugă metadata generată mai sus

                add_post_meta($attach_id, '_wp_attachment_image_alt', $filealt); // Adaugă textul alternativ (alt) 
        }
        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
Comentarii

Poți adăuga o explicație în răspuns despre cum funcționează codul?

kero kero
10 nov. 2017 12:57:16

post_exists returnează automat ID-ul postării dacă aceasta există, deci nu este necesar să folosești get_page_by_title() https://developer.wordpress.org/reference/functions/post_exists/

Uriahs Victor Uriahs Victor
4 dec. 2020 23:41:04
0

Încă nu l-am încercat. Dar ar trebui să fie atât de simplu:

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

Returnează int ID-ul postării dacă aceasta există, 0 în caz contrar.

14 ian. 2021 04:22:42
1

Această funcție ia ca parametru numele fișierului media și returnează meta_id dacă acesta există, altfel returnează (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 iul. 2017 14:57:17
Comentarii

Îmi place utilizarea LIKE. Când WordPress încarcă un fișier duplicat, adaugă un -x la numele fișierului. Unele plugin-uri adaugă o cheie unică în față pentru a preveni duplicarea (Media Cloud). post_exists($filename) va rata acest lucru. Voi modifica versiunea ta pentru a gestiona atât prefixul cât și sufixul lui $basename. Mulțumesc.

StephenFeather StephenFeather
14 mar. 2023 14:05:04