Überprüfen, ob sich eine Datei bereits in der Medienbibliothek befindet

8

Ich erstelle benutzerdefinierte Dateien in einem Plugin und füge sie der Medienbibliothek mit dem Code hinzu, der im Wordpress-Codex für wp_insert_attachment bereitgestellt wird. Mein Plugin überschreibt diese Dateien jedoch gelegentlich. Ich muss sicherstellen, dass die Dateien nicht erneut zur Medienbibliothek hinzugefügt werden. Hier ist der aktuelle Code:

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

Ich muss nur überprüfen, ob die Datei bereits Teil der Medienbibliothek ist, und sie gegebenenfalls aktualisieren. Ich habe keine post_id zum Arbeiten, nur den Permalink und den Guid.

Danke für Ihre Hilfe.

Dawson Goodell
quelle

Antworten:

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

Sie können dies oben in Ihrem Code verwenden. Überprüfen Sie dann den Wert von $count. Wenn es 0 ist, können Sie den Anhang weiter hinzufügen

Mridul Aggarwal
quelle
2

Ich weiß, dass dies eine alte Frage ist, aber mir hat keine dieser Antworten gefallen. Hier ist meine Lösung.

Dadurch wird überprüft, ob die Datei vorhanden ist. In diesem Fall wird der vorhandene Anhang aktualisiert. Wenn nicht, wird ein neuer Anhang erstellt.

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

Im obigen Beispiel verwende ich eine PDF-Datei in meinem $ -Dateinamen, aber Sie können diese durch einen beliebigen Dateinamen / Dateityp ersetzen.

Lennart
quelle
1

Ich habe diese Methode (danke 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
quelle
0

Diese Funktion verwendet als Parameter den Namen der Mediendatei und gibt die meta_id zurück, falls vorhanden, andernfalls (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;
}
gehämmert
quelle
0

Sie können überprüfen, ob ein Bild mit vorhanden ist post_exists($filename). Wenn ein Bild vorhanden ist, können Sie es aktualisieren und erstellen

 //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
quelle
1
Könnten Sie der Antwort eine Erklärung hinzufügen, wie der Code funktioniert?
Kero