Come aggiungere un'immagine a un post in modo programmatico?
Sto lavorando alla conversione dei miei vecchi blog NucleusCMS in WordPress. Ho creato una serie di tabelle localmente e ho iniziato il processo di conversione. Sono riuscito a gestire tutto fino alla "conversione" delle immagini. Penso di poter estrarre la vecchia immagine e aggiungerla alla libreria usando questa risposta. Dopodiché, mi sento un po' perso.
Quello che voglio fare è, dopo aver aggiunto un elemento multimediale (immagine) in modo programmatico, utilizzare quell'immagine aggiungendola programmaticamente a un post specifico con le dimensioni e il testo alternativo che ho appena estratto (tramite regex) dalla sorgente su cui stavo lavorando.
Passo 1. Devo ottenere un puntatore o ID o qualcosa per il media appena aggiunto.
Non sono sicuro al 100% di quello che sto facendo con WordPress stesso, quindi non so come ottenere un riferimento al media che ho appena aggiunto.
Passo 2. Devo far sì che quell'immagine diventi parte di un post.
Per quanto riguarda come aggiungerla al post (nella dimensione corretta) nel formato nativo utilizzato da WordPress...
Ho bisogno di aiuto con entrambi i passaggi.

Ciao, ho utilizzato questo codice per qualcosa di simile (stavo anche scaricando un'immagine remota e caricandola su un sito WordPress). Dai un'occhiata:
$image_url = $value; // Questo è l'URL dell'immagine sanificato.
$image = pathinfo($image_url); // Estraggo le informazioni in 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', // oppure qualunque sia lo slug del tuo post type.
'post_status' => 'publish',
'meta_input' => array(
// Se hai dei metadati, vanno qui.
),
);
$insert_id = wp_insert_post($postarr, true);
if (!is_wp_error($insert_id)) {
if ($image != '') {
// Controllo i permessi della cartella e definisco la posizione del file
if (wp_mkdir_p($upload_dir['path'])) {
$file = $upload_dir['path'] . '/' . $filename;
} else {
$file = $upload_dir['basedir'] . '/' . $filename;
}
// Creo il file immagine sul server
file_put_contents($file, $image_data);
// Controllo il tipo di file immagine
$wp_filetype = wp_check_filetype($filename, null);
// Imposto i dati dell'allegato
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => sanitize_file_name($filename),
'post_content' => '',
'post_status' => 'inherit',
);
// Creo l'allegato
$attach_id = wp_insert_attachment($attachment, $file, $insert_id);
// Includo il file image.php
require_once ABSPATH . 'wp-admin/includes/image.php';
// Definisco i metadati dell'allegato
$attach_data = wp_generate_attachment_metadata($attach_id, $file);
// Assegno i metadati all'allegato
wp_update_attachment_metadata($attach_id, $attach_data);
// Infine assegno l'immagine in evidenza al post
$thumbnail = set_post_thumbnail($insert_id, $attach_id);
}
}

Basandomi sulla risposta accettata alla domanda collegata, penso che qualcosa del genere potrebbe funzionare.
Quindi, in sintesi:
- ottieni il contenuto esistente del post con
get_post_field
- carica l'immagine con
wp_insert_attachment
che ti darà l'ID dell'immagine - recupera le dimensioni e il testo alternativo (alt) dell'immagine dal contenuto del post in qualche modo
- lascia che WordPress generi il markup HTML per l'immagine con
wp_get_attachment_image
- sostituisci il vecchio segnaposto dell'immagine con il nuovo tag HTML img
- quando tutti i segnaposto delle immagini sono stati sostituiti con i tag img, salva il contenuto modificato del post nel database con
wp_update_post
Opzionalmente imposta una qualsiasi delle immagini come immagine in evidenza del post con set_post_thumbnail
.
$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');
// Ottieni il contenuto del post
$post_content = get_post_field( 'post_content', $post_id );
// Ottieni il percorso della directory di 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' => 'mia descrizione',
'post_content' => 'mia descrizione',
'post_status' => 'inherit'
);
/**
* FASE 1
* aggiungi le immagini come allegati a WordPress
*/
$image_id = wp_insert_attachment($attachment, $name, $post_id);
// Assicurati che questo file sia incluso, poiché wp_generate_attachment_metadata() dipende da esso
require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Genera i metadati per l'allegato e aggiorna il record nel database
$attach_data = wp_generate_attachment_metadata( $image_id, $name );
wp_update_attachment_metadata( $image_id, $attach_data );
/**
* FASE 2
* Recupera i dati dell'immagine da $post_content
*/
// strpos() + substr() forse?
$width = 123;
$height = 123;
$alt = 'Ciao';
/**
* FASE 3
* ottieni il markup HTML per l'immagine
*/
// Lascia che WordPress generi il markup HTML per l'immagine, regola le dimensioni secondo necessità (thumbnail,medium,large,full,array(width,height))
$image_html = wp_get_attachment_image( $image_id, array( $width, $height ), false, array( 'alt' => $alt ) );
/**
* FASE 4
* Sostituisci i segnaposto nel contenuto con il markup img
*/
preg_replace( $pattern, $image_html, $post_content ) // Non conosco abbastanza le regex per fornire un esempio, dovrai capirlo da solo
/**
* OPZIONALE
* imposta l'immagine come in evidenza
*/
if ( $name === 'example' ) {
set_post_thumbnail( $post_id, $image_id );
}
}
/**
* FASE 5
* Aggiorna il contenuto del post
*/
$post_with_imported_images = array(
'ID' => $post_id,
'post_content' => $post_content,
);
wp_update_post( $post_with_imported_images );
MODIFICA Questo dovrebbe funzionare, magari con qualche piccolo ritocco, almeno con l'Editor Classico. Non sono sicuro riguardo a Gutenberg poiché non ho lavorato molto con esso.
