Cum setez o imagine reprezentativă (miniatură) folosind URL-ul imaginii când utilizez wp_insert_post()?
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!

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

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.

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

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.

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!

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.

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

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

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

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

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()

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

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

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

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.

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

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

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?

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

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!

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?)

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.

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

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;
}
