Fügen Sie ein Bild zur Medienbibliothek über die URL im Upload-Verzeichnis hinzu

Das Plugin “Video Embed & Thumbnail Generator” macht das Erstellen von Thumbnails aus Videos sehr gut. Es speichert die Miniatur-URL als Metadaten für den Anhang. Das Thumbnail wird dem Upload-Verzeichnis hinzugefügt. Gibt es eine Möglichkeit, dieses Bild aufzunehmen und es der Medienbibliothek hinzuzufügen, damit ich das Bild durch die function image_downsize weiterleiten kann, um eine Miniaturansicht mit einer anderen Größe zu erstellen?

wp_insert_attachment sieht so aus, als brauche es einen Pfad zu einer Datei und nicht zu einer URL, oder irre ich mich? Wie kann ich der Mediathek eine URL hinzufügen?

Dies ist möglicherweise ein Duplikat von Wie kann ich ein Bild aus dem Upload-Verzeichnis erhalten und es in die Medienbibliothek eingeben? aber das hat nie irgendwelche Antworten bekommen.

Solutions Collecting From Web of "Fügen Sie ein Bild zur Medienbibliothek über die URL im Upload-Verzeichnis hinzu"

Wenn sich das Bild in der Inhaltsquelle befindet, können Sie es extrahieren und media_sideload_image () verwenden; um es in die Medienbibliothek zu importieren.

Dieses Codebeispiel stammt von meinem Plugin Media Tools . Was hat das über eine Admin-Seite über Ajax getan. Außerdem wird das extrahierte Bild als Vorstellungsbild für den Post festgelegt. Die Post-ID wird über Ajax an diese function übergeben. Den vollständigen Code finden Sie unter: http://plugins.trac.wordpress.org/browser/media-tools/trunk/media-tools.php?rev=581988

function process_image( $post_id ) { $response = ''; $error = 0; $post = get_post( $post_id ); $img = $this->extract_image( $post ); if( empty( $img ) ) { $response .= 'No images found 
'; die( sprintf( $response . '
Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'no' ) ); } /** @var $file string or WP_Error of image attached to the post */ $file = media_sideload_image( $img, (int)$post->ID ); if ( is_wp_error( $file ) ) { $response .= 'Upload Error: Could not upload image. Check for malformed img src url
'; $error++; } else { $atts = $this->get_attach( $post->ID ); foreach ( $atts as $a ) { $img = set_post_thumbnail( $post->ID, $a['ID'] ); if ( $img ) { $thumb = wp_get_attachment_thumb_url( $a['ID'] ); $response .= '
'; $response .= ''.get_the_title( $a['ID'] ).' Set as Featured Image
'; } } unset( $atts ); unset( $a ); } die( sprintf( $response.'
Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'no' ) ); } /** * Extracts the first image in the post content * @param object $post the post object * @return bool|string false if no images or img src */ function extract_image( $post ) { $html = $post->post_content; if ( stripos( $html, ' $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'posts_per_page' => (int)1 ), ARRAY_A ); }

Hier sind die wesentlichen Teile, die ich von der function kg_video_attachment_fields_to_save() geändert habe, die kg_video_attachment_fields_to_save() filtert:

  $thumb_url = $attachment['kgflashmediaplayer-poster']; //insert the $thumb_url into the media library if it does not already exist if ( ! ($thumb_id = get_attachment_id_from_src( $thumb_url ) ) ) { $post_id = $post['ID']; $desc = $attachment['post_title'] . ' thumbnail'; //is image in uploads directory? $upload_dir = wp_upload_dir(); if ( FALSE !== strpos( $url, $upload_dir['baseurl'] ) ) { $wp_filetype = wp_check_filetype(basename($thumb_url), null ); $filename = preg_replace('/\.[^.]+$/', '', basename($thumb_url)); $attachment = array( 'guid' => $thumb_url, 'post_mime_type' => $wp_filetype['type'], 'post_title' => $desc, 'post_content' => '', 'post_status' => 'inherit' ); $thumb_id = wp_insert_attachment( $attachment, basename($thumb_url), $post_id ); // 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( $thumb_id, basename($thumb_url) ); wp_update_attachment_metadata( $thumb_id, $attach_data ); } else { //not in uploads so we'll have to sideload it $tmp = download_url( $thumb_url ); // Set variables for storage // fix file filename for query strings preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $thumb_url, $matches); $file_array['name'] = basename($matches[0]); $file_array['tmp_name'] = $tmp; // If error storing temporarily, unlink if ( is_wp_error( $tmp ) ) { @unlink($file_array['tmp_name']); $file_array['tmp_name'] = ''; } // do the validation and storage stuff $thumb_id = media_handle_sideload( $file_array, $post_id, $desc ); // If error storing permanently, unlink if ( is_wp_error($thumb_id) ) { @unlink($file_array['tmp_name']); return $thumb_id; } if ( $local_src = wp_get_attachment_url( $thumb_id ) ) { update_post_meta($post['ID'], '_kgflashmediaplayer-poster', $local_src); } } //end sideload } //end get_attachment_id_from_src if(!is_wp_error($thumb_id)) { $thumb_id = intval( $thumb_id ); update_post_meta($post['ID'], '_kgflashmediaplayer-poster-id', $thumb_id); } 

Und die benutzerdefinierte Thumbnail-ID des Videos wird jetzt im Meta-Feld gespeichert: _kgflashmediaplayer-poster-id

 function get_attachment_id_from_src ($image_src) { global $wpdb; $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'"; $id = $wpdb->get_var($query); return $id; } 

Ich liebe nicht die get_attachment_id_from_src() aber es gibt keine eingebaute Möglichkeit, dies zu tun. Ich sollte eine Überprüfung hinzufügen, so dass diese Abfrage nicht ausgeführt werden muss, wenn der aktuelle Quellcode derselbe wie der alte Quellcode ist. Das Embedder-Plugin erstellt für jedes Video viele potentielle Thumbnails. Sie müssen nicht alle in die Medienbibliothek eingefügt werden. Dies wird ausgetriggers, wenn ein Medien-Anhang gespeichert wird und Bilder, die sich bereits in der Medienbibliothek befinden, abdeckt befinden sich im Medienverzeichnis, aber nicht in der Bibliothek und Bilder auf anderen Servern (die sideloaded werden und die URL an die neue lokale URL angepasst wird)