Adăugarea programatică a imaginilor în biblioteca media

17 feb. 2017, 13:56:45
Vizualizări: 64.9K
Voturi: 33

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

}
0
Toate răspunsurile la întrebare 4
8
39
$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 );
17 feb. 2017 14:27:16
Comentarii

de unde vine $attach_id?

user1889580 user1889580
27 sept. 2017 17:23:34

lipsea... l-am adăugat

Omtara Omtara
30 oct. 2017 18:30:56

Fișier descărcat dar nu există thumbnail disponibil, URL-ul atașamentului returnează și el eroare 404

Umair Hamid Umair Hamid
22 mai 2018 22:51:46

@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 philippe_b
23 oct. 2018 00:24:09

și cum pot obține noul URL?

zEn feeLo zEn feeLo
3 mai 2019 21:19:02

nu funcționează, are cineva răspunsul?

zEn feeLo zEn feeLo
8 mai 2019 10:55:31

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 Ian Jamieson
3 iul. 2019 23:28:03

cum pot încărca o imagine ca fișier de pe computer și nu ca URL?

AndiM AndiM
5 sept. 2019 08:45:38
Arată celelalte 3 comentarii
2
15

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;
}
19 iul. 2020 06:46:56
Comentarii

Ț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 KittMedia
7 sept. 2021 12:58:13

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 Smithee
19 ian. 2023 13:19:20
0

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
4 dec. 2018 18:57:47
2
`<?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;
    }
}?>`
12 feb. 2024 07:57:07
Comentarii

Î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 User
14 feb. 2024 00:34:40

Se pare că este aceeași abordare de bază ca în răspunsurile lui Paul. Se aplică și aici observațiile de acolo, cum ar fi cele despre ștergerea încărcărilor eșuate?

Rup Rup
16 feb. 2024 02:21:02