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.
Chris
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
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
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
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
Permiteți-mi să adaug și eu laudele. Ador acest fragment de cod. Mulțumesc că mi-ai economisit ore întregi!
bkwdesign
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
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
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
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
Când folosesc acest cod, imaginile create în directorul "uploads" au dimensiunea zero.
Jay Brunet
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.
Mostafa Soufi
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
Pot confirma că codul modificat nu funcționează, ceea ce este păcat deoarece încărcarea URL-urilor ar fi fost minunată!
Zach Nicodemous
Î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?
Chris
Deoarece deja inserezi un articol, am presupus că deja atașezi imagini la postarea pe care o creezi. Este o presupunere incorectă?
Chip Bennett
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
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
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;
}