Cum pot adăuga programatic o imagine într-un articol?
Lucrez la migrarea blogurilor mele vechi de pe NucleusCMS către WordPress. Am creat un set de tabele local și am început procesul de conversie. Am reușit bine până la "conversia" imaginilor. Cred că pot extrage vechea imagine și să o adaug în bibliotecă folosind acest răspuns. După aceea, sunt puțin pierdut.
Ceea ce vreau să fac este, după ce am adăugat programatic un element media (imagine), să folosesc acea imagine adăugând-o programatic într-un anumit articol cu dimensiunile și textul alternativ pe care le-am extras (prin regex) din sursa cu care lucram.
Pasul 1. Am nevoie să obțin un pointer sau ID pentru media adăugată recent.
Nu sunt 100% sigur ce fac cu WordPress în sine, așa că nu știu cum să obțin o referință către media pe care tocmai am adăugat-o.
Pasul 2. Trebuie să fac ca acea imagine să facă parte dintr-un articol.
În ceea ce privește cum o adaug în articol (la dimensiunea corectă) în orice format folosește WordPress în mod nativ...
Am nevoie de ajutor pentru ambele etape.

Hei, am folosit acest cod pentru ceva similar (am descărcat și încărcat imagini de la distanță pe un site WordPress). Te rog să arunci o privire:
$image_url = $value; // Aceasta este URL-ul imaginii, sanitizat.
$image = pathinfo($image_url); // Extragerea informațiilor într-un array.
$image_name = $image['basename'];
$upload_dir = wp_upload_dir();
$image_data = file_get_contents($image_url);
$unique_file_name = wp_unique_filename($upload_dir['path'], $image_name);
$filename = basename($unique_file_name);
$postarr = array(
'post_title' => $post_title,
'post_content' => $post_content,
'post_type' => 'post', // sau orice alt slug de tip de postare ai.
'post_status' => 'publish',
'meta_input' => array(
// Dacă ai orice metadate, acestea vor fi aici.
),
);
$insert_id = wp_insert_post($postarr, true);
if (!is_wp_error($insert_id)) {
if ($image != '') {
// Verifică permisiunile folderului și definește locația fișierului
if (wp_mkdir_p($upload_dir['path'])) {
$file = $upload_dir['path'] . '/' . $filename;
} else {
$file = $upload_dir['basedir'] . '/' . $filename;
}
// Creează fișierul imaginii pe server
file_put_contents($file, $image_data);
// Verifică tipul fișierului imaginii
$wp_filetype = wp_check_filetype($filename, null);
// Setează datele atașamentului
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => sanitize_file_name($filename),
'post_content' => '',
'post_status' => 'inherit',
);
// Creează atașamentul
$attach_id = wp_insert_attachment($attachment, $file, $insert_id);
// Include fișierul image.php
require_once ABSPATH . 'wp-admin/includes/image.php';
// Definește metadatele atașamentului
$attach_data = wp_generate_attachment_metadata($attach_id, $file);
// Atribuie metadatele atașamentului
wp_update_attachment_metadata($attach_id, $attach_data);
// Și în final atribuie imaginea reprezentativă postării
$thumbnail = set_post_thumbnail($insert_id, $attach_id);
}
}

Continuând răspunsul acceptat la întrebarea legată, cred că ceva de genul acesta ar putea funcționa.
Deci, în principiu:
- obțineți conținutul existent al postării cu
get_post_field
- încărcați imaginea cu
wp_insert_attachment
care vă oferă ID-ul imaginii - preluați dimensiunea imaginii și textul alternativ din conținutul postării cumva
- lăsați WordPress să genereze marcajul HTML pentru imagine cu
wp_get_attachment_image
- înlocuiți vechiul placeholder al imaginii cu noul HTML al imaginii
- când toate placeholderele de imagini au fost înlocuite cu taguri img, salvați conținutul modificat al postării în baza de date cu
wp_update_post
Opțional, setați oricare dintre imagini ca thumbnail / imagine reprezentativă a postării cu set_post_thumbnail
.
$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');
// Obține conținutul postării
$post_content = get_post_field( 'post_content', $post_id );
// Obține calea către directorul de upload
$wp_upload_dir = wp_upload_dir();
foreach($images as $name) {
$attachment = array(
'guid'=> $wp_upload_dir['url'] . '/' . basename( $name ),
'post_mime_type' => 'image/png',
'post_title' => 'descrierea mea',
'post_content' => 'descrierea mea',
'post_status' => 'inherit'
);
/**
* PASUL 1
* adaugă imaginile ca atașamente în WordPress
*/
$image_id = wp_insert_attachment($attachment, $name, $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 în baza de date.
$attach_data = wp_generate_attachment_metadata( $image_id, $name );
wp_update_attachment_metadata( $image_id, $attach_data );
/**
* PASUL 2
* Preluare date imagine din $post_content
*/
// strpos() + substr() poate?
$width = 123;
$height = 123;
$alt = 'Salut';
/**
* PASUL 3
* obține marcajul HTML pentru imagine
*/
// Lasă WP să genereze marcajul HTML pentru imagine, ajustează dimensiunea după necesități (thumbnail,medium,large,full,array(width,height))
$image_html = wp_get_attachment_image( $image_id, array( $width, $height ), false, array( 'alt' => $alt ) );
/**
* PASUL 4
* Înlocuiește placeholderele din conținut cu marcajul img
*/
preg_replace( $pattern, $image_html, $post_content ) // Nu înțeleg suficient regex pentru a oferi un exemplu, așa că va trebui să vă descurcați singur
/**
* OPȚIONAL
* setează imaginea ca reprezentativă
*/
if ( $name === 'example' ) {
set_post_thumbnail( $post_id, $image_id );
}
}
/**
* PASUL 5
* Actualizează conținutul postării
*/
$post_with_imported_images = array(
'ID' => $post_id,
'post_content' => $post_content,
);
wp_update_post( $post_with_imported_images );
EDITARE Aceasta ar trebui să funcționeze, poate cu mici ajustări, cel puțin cu Editorul Clasic. Nu sunt sigur pentru Gutenberg deoarece nu am lucrat prea mult cu el.
