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

@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.

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

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'

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.

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.
