Cum setez o imagine reprezentativă (miniatură) folosind URL-ul imaginii când utilizez wp_insert_post()?

26 ian. 2012, 23:56:46
Vizualizări: 139K
Voturi: 71

Parcurgând documentația funcției wp_insert_post(), am observat că nu există niciun parametru în array-ul necesar care să îmi permită să setez 'Imaginea Reprezentativă' pentru un articol, afișată ca miniatură a articolului în tema mea.

Am analizat funcții precum set_post_thumbnail(), așa cum a sugerat Dl. Bennett, dar aceasta pare să fie o adăugare relativ nouă la WordPress și la documentația WordPress. Ca atare, nu pot găsi surse care să explice cum ar trebui obținut și furnizat parametrul $thumbnail_id. Dacă aceasta este într-adevăr funcția care trebuie folosită, în ce mod aș putea să-i furnizez un parametru $thumbnail_id valid când tot ce am este URL-ul unei imagini?

Mulțumesc anticipat!

0
Toate răspunsurile la întrebare 6
13
121

Puteți seta o imagine ca miniatură a articolului atunci când aceasta se află în biblioteca de media. Pentru a adăuga o imagine în biblioteca de media, trebuie să o încărcați pe server. WordPress are deja o funcție pentru introducerea imaginilor în biblioteca de media, aveți nevoie doar de un script care să încarce fișierul.

Utilizare:

Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );

// $post_id este ID-ul numeric... Puteți obține ID-ul și cu:
wp_insert_post()

Funcția:

function Generate_Featured_Image( $image_url, $post_id  ){
    $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, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

http://codex.wordpress.org/Function_Reference/wp_upload_dir

http://codex.wordpress.org/Function_Reference/wp_insert_attachment


EDIT: Adăugată crearea căii

http://codex.wordpress.org/Function_Reference/wp_mkdir_p

6 feb. 2012 00:07:36
Comentarii

Mulțumesc pentru eforturile tale! Acest lucru funcționează doar atunci când folosești $upload_dir['basedir'] (în loc de path), deoarece atunci când inspectez atașamentul prin interfața de editare a postării, acesta este referențiat ca .../uploads/NUME_FISIER.EXT în timp ce $upload_dir['path'] l-ar stoca în ceva de genul .../uploads/2012/02/NUME_FISIER.EXT.

Ar putea fi și mai bine să schimbăm cum este referențiat fișierul, dar nu știu cum.

Chris Chris
6 feb. 2012 20:02:03

Am adăugat crearea căii în răspunsul meu.

Rob Vermeer Rob Vermeer
6 feb. 2012 20:47:16

Apreciez răspunsul rapid :). Totuși, obțin același rezultat, iată o captură de ecran care ilustrează problema mea: http://i.imgur.com/iKTNs.png. Secțiunea superioară este rezultatul plasării unui echo în condiționalul tău, doar pentru a vedea ce se întâmplă.

Chris Chris
6 feb. 2012 22:17:22

Am schimbat din nou, nu am transmis calea completă către wp_insert_attachment și wp_generate_attachment_metadata. Sper că aceasta va rezolva problema.

Rob Vermeer Rob Vermeer
6 feb. 2012 22:28:38

Funcționează perfect, mulțumesc mult! Acest lucru a rezolvat și o problemă de dimensiune, care aparent era cauzată de căi incorecte (chiar dacă imaginea apărea). Nu putea fi mai bine!

Chris Chris
6 feb. 2012 22:56:26

Mulțumesc pentru codul tău excelent. A fost necesară o singură modificare pentru a-l face să funcționeze cu importul meu CSV și anume adăugarea postid-ului înaintea numelui fișierului pentru a asigura unicitatea fișierelor de imagine.

Dave Hilditch Dave Hilditch
7 dec. 2012 19:46:25

Permiteți-mi să adaug și eu laudele. Ador acest fragment de cod. Mulțumesc că mi-ai economisit ore întregi!

bkwdesign bkwdesign
11 feb. 2013 04:47:47

Mă întreb: Este acest lucru sigur? Există riscul ca cineva să mascheze o imagine sau funcția wp_check_filetype() se ocupă de asta?

LOLapalooza LOLapalooza
14 feb. 2015 06:20:56

Am folosit codul de mai sus și l-am adaptat ușor pentru a obține imaginile reprezentative care poartă numele slug-ului articolului (ceea ce poate fi consumator de timp dacă ai mii de articole): code <?php $slug = basename(get_permalink());
$featuredimageurl = '[CĂILEA TA]/wp-content/uploads/featuredimages/' . $slug . '.png'; Generate_Featured_Image( $featuredimageurl, $post_id ); ?>

Traveler Traveler
19 ian. 2017 10:45:49

utilizarea funcției file_get_contents cu un URL nu va funcționa dacă allow_url_fopen este dezactivat în php.ini - wp_remote_get va fi mai compatibilă în diferite medii WordPress

highvolt highvolt
24 feb. 2017 16:39:44

Atenție: Acest răspuns rescrie fișierul dacă acesta are același nume, fiți atenți. Ar trebui să genereze nume folosind $post_id sau cel puțin uniqid()

Ivan Castellanos Ivan Castellanos
1 iun. 2017 00:59:37

Când folosesc acest cod, imaginile create în directorul "uploads" au dimensiunea zero.

Jay Brunet Jay Brunet
23 mar. 2018 02:57:04

Pentru acele URL-uri care conțin spații, folosește această comandă pentru $image_data: $image_data = file_get_contents(str_replace(' ', '%20', $image_url));

user45288 user45288
8 dec. 2020 05:39:50
Arată celelalte 8 comentarii
4
23

Doresc să îmbunătățesc răspunsul lui Rob utilizând funcțiile de bază din WP download_url și media_handle_sideload

<?php
/**
* Descarcă o imagine de la URL-ul specificat și o atașează unui post ca imagine reprezentativă.
*
* @param string $file    URL-ul imaginii de descărcat.
* @param int    $post_id ID-ul postului cu care va fi asociată imaginea reprezentativă.
* @param string $desc    Opțional. Descrierea imaginii.
* @return string|WP_Error ID-ul atașamentului sau obiect WP_Error în caz de eroare.
*/
function Generate_Featured_Image( $file, $post_id, $desc ){
    // Setează variabile pentru stocare, corectează numele fișierului pentru parametrii de query.
    preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
    if ( ! $matches ) {
         return new WP_Error( 'image_sideload_failed', __( 'URL de imagine invalid' ) );
    }

    $file_array = array();
    $file_array['name'] = basename( $matches[0] );

    // Descarcă fișierul într-o locație temporară.
    $file_array['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 procesul de stocare.
    $id = media_handle_sideload( $file_array, $post_id, $desc );

    // Dacă apare o eroare la stocarea permanentă, șterge fișierul temporar.
    if ( is_wp_error( $id ) ) {
        @unlink( $file_array['tmp_name'] );
        return $id;
    }
    return set_post_thumbnail( $post_id, $id );

}
2 mar. 2016 09:23:22
Comentarii

Folosirea funcțiilor native WordPress este cea mai bună practică, mulțumesc.

Mostafa Soufi Mostafa Soufi
15 sept. 2018 18:39:56

Din anumite motive, această versiune mi-a dat erori spunând "Nu a fost furnizată o adresă URL validă.", în timp ce răspunsul lui Rob Vermeer a funcționat.

Flimm Flimm
28 aug. 2019 20:09:19

Pot confirma că codul modificat nu funcționează, ceea ce este păcat deoarece încărcarea URL-urilor ar fi fost minunată!

Zach Nicodemous Zach Nicodemous
10 nov. 2020 01:16:01

Acest cod funcționează perfect pentru mine, chiar dacă am avut probleme cu răspunsul original.

Jsilvermist Jsilvermist
19 nov. 2020 00:47:39
5
10

Încearcă să folosești set_post_thumbnail().

Editat de Otto: Ai clarificat întrebarea ta, așa că voi clarifica și răspunsul dat de Chip.

În esență, trebuie să creezi și 'attachment' pentru postare. Când o imagine este încărcată în biblioteca media WordPress, se creează o intrare specială pentru aceasta cu un tip de postare de tip attachment. Acest attachment este legat de o anumită postare prin identificatorul post_parent.

Deci, dacă cunoști ID-ul attachment-ului, atunci apelarea funcției set_post_thumbnail cu obiectul sau ID-ul postării și ID-ul attachment-ului va seta pur și simplu steagul pentru thumbnail-ul postării.

Dacă nu ai creat încă attachment-ul, atunci va trebui să faci asta mai întâi. Cel mai simplu mod de a face acest lucru este cu wp_insert_attachment(). Această funcție primește un array cu câțiva parametri, numele fișierului (fișierul trebuie să fie deja în directorul corect de încărcare), și ID-ul postării părinte căreia dorești să atașezi attachment-ul.

Simpla încărcare și atașare a unui fișier la o postare nu face nimic automat. Acesta este pur și simplu un mecanism de categorizare. De exemplu, mecanismul galeriei folosește imaginile atașate unei postări pentru a construi [gallery] pentru acea postare. Un thumbnail pentru o postare este doar una dintre imaginile atașate care a fost setată să fie thumbnail.

Mai multe informații despre cum să folosești wp_insert_attachment pot fi găsite în codex (linkat mai sus).

27 ian. 2012 00:08:09
Comentarii

Mulțumesc pentru răspuns! Totuși, cum aș putea obține ID-ul thumbnail-ului? Încep cu un URL de imagine, deci presupun că ar trebui să adaug cumva o imagine în biblioteca WordPress folosind o altă funcție?

Chris Chris
27 ian. 2012 19:44:57

Deoarece deja inserezi un articol, am presupus că deja atașezi imagini la postarea pe care o creezi. Este o presupunere incorectă?

Chip Bennett Chip Bennett
27 ian. 2012 20:15:28

Scuze, dar încă nu am aflat cum să atașez efectiv imagini la o postare folosind un URL. De asemenea, nu aș dori ca imaginea să fie afișată efectiv în postarea în sine. Momentan caut funcția care va returna $thumbnail_id și m-am gândit că poate wp_insert_attachment() ar funcționa, până când am observat că deja necesită ca atașamentul să fie în directorul de upload. Nu știu cum să obțin un fișier imagine acolo prin URL-ul său și nu sunt sigur dacă aceasta este funcția pe care o caut în primul rând. Mulțumesc pentru ajutor!

Chris Chris
27 ian. 2012 22:59:37

Poți să rescrii întrebarea ta cu aceste informații, pentru a descrie mai bine ce încerci să realizezi? (Sau, poți lăsa aceasta așa cum este și să începi o nouă întrebare, pentru a afla cum să obții ID-ul atașamentului atunci când inserezi un post?)

Chip Bennett Chip Bennett
27 ian. 2012 23:03:35

Întrebarea originală a fost editată și parțial reformulată, te rog să verifici din nou :).

Chris Chris
27 ian. 2012 23:38:45
0

Tocmai am găsit acest cod și l-am simplificat considerabil, funcționează dar nu sunt expert în securitate

if(!empty($_FILES)){
    require_once( ABSPATH . 'wp-admin/includes/post.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $post_ID = "your post id!";

    $attachment_id = media_handle_upload( 'file', $post_ID );
    set_post_thumbnail( $post_ID, $attachment_id );
}

simplu sau ce? după ce include fișierele necesare, WordPress se va ocupa de media și o va încărca, apoi o va seta ca imagine thumbnail.

21 feb. 2015 01:45:56
0

set_post_thumbnail() este cea mai bună funcție pentru această cerință.

Cred că poți găsi ID-ul unui atașament prin get_children() sau get_posts(). Rezultatul este un array iar în interiorul acestui array se află ID-ul. Următorul exemplu este pentru testare; sper să funcționeze; l-am scris fără teste, doar la repezeală.

Pentru cerința ta este important să înlocuiești get_the_ID() cu ID-ul postării; returnează ID-ul Atașamentului și acesta îl poți folosi pentru set_post_thumbnail().

$attachments = get_children( 
    array(
        'post_parent' => get_the_ID(), 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image'
    )
);
foreach ( $attachments as $attachment_id => $attachment ) {
    echo wp_get_attachment_image($attachment_id);
}
6 feb. 2012 17:14:25
0

Ai nevoie de unele biblioteci de bază încărcate pentru a păstra lucrurile simple.

function attach_image_from_url_to_post($image_url, $post_id) {
    // Verifică dacă funcția există (face parte din media.php)
    if (!function_exists('media_sideload_image')) {
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        require_once(ABSPATH . 'wp-admin/includes/file.php');
        require_once(ABSPATH . 'wp-admin/includes/media.php');
    }

    // Descarcă și încarcă imaginea din exterior
    $image = media_sideload_image($image_url, $post_id, null, 'id');

    // Dacă există o eroare, returnează-o
    if (is_wp_error($image)) {
        return $image;
    }

    // Setează imaginea ca imagine reprezentativă (thumbnail pentru postare)
    set_post_thumbnail($post_id, $image);

    return true;
}
15 mar. 2025 23:00:39