Adăugarea programatică a imaginilor în biblioteca media
Încerc să adaug programatic mai multe imagini în biblioteca media, am încărcat imaginile în wp-content/uploads, acum încerc să folosesc wp_insert_attachement.
Iată codul, totuși nu funcționează cum mă așteptam, cred că metadatele nu sunt generate corect, pot vedea fișierele în biblioteca media, dar fără miniatură, de asemenea, dacă editez imaginea primesc o eroare care îmi spune să reîncarc imaginea.
$filename_array = array(
'article1.jpg',
'article2.jpg',
);
// ID-ul postării pentru care este acest atașament
$parent_post_id = 0;
// Obține calea către directorul de încărcare
$wp_upload_dir = wp_upload_dir();
foreach ($filename_array as $filename) {
// Verifică tipul fișierului. Îl vom folosi ca 'post_mime_type'
$filetype = wp_check_filetype( basename( $filename ), null );
// Pregătește un array cu datele postării pentru atașament
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ),
'post_mime_type' => $filetype['type'],
'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
'post_content' => '',
'post_status' => 'inherit'
);
// Inserează atașamentul
$attach_id = wp_insert_attachment( $attachment, $filename, $parent_post_id );
// Asigură-te că acest fișier este inclus, deoarece wp_generate_attachment_metadata() depinde de el
require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Generează metadatele pentru atașament și actualizează înregistrarea din baza de date
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
}
$image_url = 'adresa imaginii';
$upload_dir = wp_upload_dir();
$image_data = file_get_contents( $image_url );
$filename = basename( $image_url );
if ( wp_mkdir_p( $upload_dir['path'] ) ) {
$file = $upload_dir['path'] . '/' . $filename;
}
else {
$file = $upload_dir['basedir'] . '/' . $filename;
}
file_put_contents( $file, $image_data );
$wp_filetype = wp_check_filetype( $filename, null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => sanitize_file_name( $filename ),
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $file );
require_once( ABSPATH . 'wp-admin/includes/image.php' );
$attach_data = wp_generate_attachment_metadata( $attach_id, $file );
wp_update_attachment_metadata( $attach_id, $attach_data );
Fișier descărcat dar nu există thumbnail disponibil, URL-ul atașamentului returnează și el eroare 404
Umair Hamid
@UmairHamid La fel și aici. Asta se întâmplă pentru că al doilea argument al funcției wp_insert_attachment ar trebui să fie calea către fișier (deci $file în acest exemplu), nu numele fișierului. Am editat răspunsul și aștept aprobare.
philippe_b
Folosește wp_get_attachment_image_src pentru a obține URL-ul, de exemplu wp_get_attachment_image_src($attach_id) - https://developer.wordpress.org/reference/functions/wp_get_attachment_image_src
Ian Jamieson
Dacă utilizați funcționalitatea de sideload din WordPress, puteți face acest lucru mai ușor (și lăsați WordPress să se ocupe de toată curățarea pentru voi).
<?php
// exemplu:
// $file = 'http://www.example.com/image.png';
// $description = 'o descriere';
function my_upload_image( $file, $description ) {
$file_array = [ 'name' => wp_basename( $file ), 'tmp_name' => download_url( $file ) ];
// Dacă apare o eroare la stocarea temporară, returnează eroarea.
if ( is_wp_error( $file_array['tmp_name'] ) ) {
return $file_array['tmp_name'];
}
// Efectuează validarea și operațiunile de stocare.
$id = media_handle_sideload( $file_array, 0, $description );
// Dacă apare o eroare la stocarea permanentă, șterge fișierul temporar.
if ( is_wp_error( $id ) ) {
@unlink( $file_array['tmp_name'] );
return $id;
}
return true;
}
Țineți cont că acest lucru funcționează doar din interiorul /wp-admin/. În afara acestuia, trebuie să vă asigurați că includeți aceste trei fișiere:
ABSPATH . 'wp-admin/includes/file.php',
ABSPATH . 'wp-admin/includes/media.php',
ABSPATH . 'wp-admin/includes/image.php'
KittMedia
Această metodă funcționează și pentru imaginile deja stocate pe server, pur și simplu folosiți calea imaginii în loc de download_url( $file ). Dar dacă faceți acest lucru, rețineți că atunci când utilizați media_handle_sideload, imaginea va fi ștearsă automat după procesare. Dacă nu doriți ca acest lucru să se întâmple, copiați imaginea în directorul tmp prin $tmp_path = get_temp_dir() . basename( $file ); copy( $file, $tmp_path );, apoi puteți folosi 'tmp_name' => $tmp_path în schimb.
Smithee
Am avut probleme cu soluția lui @TrubinE unde fișierele de imagini nu se încărcau.
Aici este un exemplu complet care a funcționat pentru mine: https://gist.github.com/m1r0/f22d5237ee93bcccb0d9
Aceasta este o idee similară, dar folosește biblioteca WP HTTP pentru a prelua conținutul în loc de file_get_contents(). Iată conținutul soluției de pe github gist de la m1r0:
if ( ! class_exists( 'WP_Http' ) ) {
include_once( ABSPATH . WPINC . '/class-http.php' );
}
$http = new WP_Http();
$response = $http->request( $meta['image_url'] );
if ( $response['response']['code'] !== 200 ) {
return false;
}
$upload = wp_upload_bits( basename( $meta['image_url'] ), null, $response['body'] );
if ( !empty( $upload['error'] ) ) {
return false;
}
$file_path = $upload['file'];
$file_name = basename( $file_path );
$file_type = wp_check_filetype( $file_name, null );
$attachment_title = sanitize_file_name( pathinfo( $file_name, PATHINFO_FILENAME ) );
$wp_upload_dir = wp_upload_dir();
$post_info = array(
'guid' => $wp_upload_dir['url'] . '/' . $file_name,
'post_mime_type' => $file_type['type'],
'post_title' => $attachment_title,
'post_content' => '',
'post_status' => 'inherit',
);
$attach_id = wp_insert_attachment( $post_info, $file_path, $parent_post_id );
require_once( ABSPATH . 'wp-admin/includes/image.php' );
$attach_data = wp_generate_attachment_metadata( $attach_id, $file_path );
wp_update_attachment_metadata( $attach_id, $attach_data );
return $attach_id; codul aici
`<?php
// cea mai simplă metodă de încărcare a unei imagini
$url_image = "http://example.com/any_image.jpg" ;
$new_image_id = upload_image_by_url ( $url_image );
function upload_image_by_url ($url) {
$title = basename($url) ;
$image_for_post_id = 0 ; // 0 înseamnă că imaginea nu este asociată cu articolul
$imgid = media_sideload_image( $url, $image_for_post_id, $title, 'id' );
if ( is_wp_error($imgid) ) {
echo "<br>Eroare upload_image_by_url($url): ";
echo $imgid->get_error_message();
return false;
}
else {
echo "<br>upload_image_by_url($url) = $imgid";
return $imgid;
}
}?>`
În forma actuală, răspunsul tău este neclar. Te rugăm să [editezi] pentru a adăuga detalii suplimentare care să ajute pe alții să înțeleagă cum abordează aceasta întrebarea pusă. Poți găsi mai multe informații despre cum să scrii răspunsuri bune în centrul de ajutor.
User