Adăugare imagine în biblioteca media din URL în directorul uploads
Plugin-ul "Video Embed & Thumbnail Generator" face o treabă excelentă generând thumbnail-uri din videoclipuri. Acesta salvează URL-ul thumbnail-ului ca metadate pentru atașament. Thumbnail-ul este adăugat în directorul uploads. Există vreo metodă prin care să pot lua această imagine și să o adaug în biblioteca media, astfel încât să o pot procesa prin funcția image_downsize pentru a crea thumbnails de dimensiuni diferite?
Funcția wp_insert_attachment pare să necesite o cale către un fișier și nu un URL, sau greșesc? Cum pot adăuga un URL în biblioteca media?
Această întrebare este posibil un duplicat al Cum pot obține o imagine din directorul uploads și să o introduc în biblioteca media? dar acea întrebare nu a primit niciun răspuns.

Dacă imaginea se află în sursa conținutului, o puteți extrage și utiliza media_sideload_image(); pentru a o importa în biblioteca media.
Acest exemplu de cod este din plugin-ul meu Media Tools, care face acest lucru printr-o pagină de administrare via ajax. De asemenea, setează imaginea extrasă ca imagine reprezentativă pentru articol. ID-ul articolului este transmis acestei funcții prin ajax. Pentru a vedea codul complet, accesați: 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 .= 'Nu au fost găsite imagini <br>';
die( sprintf( $response . '<br>Media tool complete (Post ID %1$s) în %2$s secunde. %3$d erori', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'niciuna' ) );
}
/** @var $file string sau WP_Error a imaginii atașate postării */
$file = media_sideload_image( $img, (int)$post->ID );
if ( is_wp_error( $file ) ) {
$response .= '<span style="color:red">Eroare la încărcare: Nu s-a putut încărca imaginea. Verificați URL-ul src img pentru erori</span><br>';
$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 .= '<img src="'.esc_url( $thumb ).'" /><br>';
$response .= '<a href="'.wp_nonce_url( get_edit_post_link( $a['ID'], true ) ).'" >'.get_the_title( $a['ID'] ).'</a> Setată ca Imagine Reprezentativă</p><br>';
}
}
unset( $atts );
unset( $a );
}
die( sprintf( $response.'<br>Media tool complete (Post ID %1$s) în %2$s secunde. %3$d erori', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'niciuna' ) );
}
/**
* Extrage prima imagine din conținutul postării
* @param object $post obiectul post
* @return bool|string false dacă nu există imagini sau src img
*/
function extract_image( $post ) {
$html = $post->post_content;
if ( stripos( $html, '<img' ) !== false ) {
$regex = '#<\s*img [^\>]*src\s*=\s*(["\'])(.*?)\1#im';
preg_match( $regex, $html, $matches );
unset( $regex );
unset( $html );
if ( is_array( $matches ) && ! empty( $matches ) ) {
return $matches[2];
} else {
return false;
}
} else {
return false;
}
}
/**
* Interoghează pentru imaginile atașate
* @param int $post_id ID-ul postării pentru a verifica dacă există atașamente
* @return array|bool Primul atașament în caz de succes, false dacă nu există atașamente
*/
function get_attach( $post_id ) {
return get_children( array (
'post_parent' => $post_id,
'post_type' => 'attachment',
'post_mime_type' => 'image',
'posts_per_page' => (int)1
), ARRAY_A );
}

media_sideload_image() pare promițătoare, dar cum obții ID-ul atașamentului pentru imaginea încărcată lateral?

te referi la get_attachment? asta are nevoie de ID-ul pe care încă nu îl am. o să mă uit la media_handle_sideload()

de asemenea, încărcarea laterală a fișierelor media nu este chiar corectă pentru că duplică imaginile care sunt deja în folderul wp-uploads (unde plugin-ul video embedder le adaugă)

Ei bine, video embedder ar trebui să le adauge în biblioteca ta media în loc să le depună pur și simplu în directorul de încărcări.

Iată părțile relevante pe care le-am modificat din funcția kg_video_attachment_fields_to_save()
care filtrează attachment_fields_to_save:
$thumb_url = $attachment['kgflashmediaplayer-poster'];
//inserează $thumb_url în biblioteca media dacă nu există deja
if ( ! ($thumb_id = get_attachment_id_from_src( $thumb_url ) ) ) {
$post_id = $post['ID'];
$desc = $attachment['post_title'] . ' thumbnail';
//imaginea este în directorul uploads?
$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 );
// 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( $thumb_id, basename($thumb_url) );
wp_update_attachment_metadata( $thumb_id, $attach_data );
} else { //nu este în uploads, așa că va trebui să-l încărcăm manual (sideload)
$tmp = download_url( $thumb_url );
// Setează variabilele pentru stocare
// corectează numele fișierului pentru 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;
// Dacă apare o eroare la stocarea temporară, șterge fișierul
if ( is_wp_error( $tmp ) ) {
@unlink($file_array['tmp_name']);
$file_array['tmp_name'] = '';
}
// face validarea și stocarea
$thumb_id = media_handle_sideload( $file_array, $post_id, $desc );
// Dacă apare o eroare la stocarea permanentă, șterge fișierul
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);
}
} //final sideload
} //final 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);
}
Iar ID-ul thumbnail-ului personalizat al videoclipului este acum stocat în câmpul meta: _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;
}
Nu sunt încântat de funcția get_attachment_id_from_src()
dar nu există o metodă integrată pentru a face acest lucru. Ar trebui să adaug o verificare, astfel încât dacă src-ul curent este același cu cel vechi, această interogare să nu mai fie necesară. Plugin-ul de embedare creează multe thumbnail-uri potențiale pentru fiecare videoclip și nu este nevoie să le introducem pe toate în biblioteca media.... așadar, acest cod se execută de fiecare dată când un atașament media este salvat și ar trebui să acopere imaginile care sunt deja în biblioteca media, imaginile care sunt în directorul media dar nu în bibliotecă și imaginile de pe alte servere (care sunt încărcate manual, iar URL-ul este ajustat la noul URL local)

Funcție minunată... a necesitat puțină ajustare dar a funcționat excelent pentru nevoile mele ;)

Deoarece această soluție are 3 ani, aș presupune că acum există o metodă mult mai bună de a face asta.

încă a funcționat pentru mine - ceea ce era tot ce aveam nevoie ;) - un cod rapid, gata de utilizat și detaliat. mulțumesc.
