Come aggiungere un'immagine a un post in modo programmatico?

30 dic 2018, 20:43:27
Visualizzazioni: 14K
Voti: 2

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.

4
Commenti

Finora ho capito che WordPress chiama questo sideloading ma ci sono diverse funzioni simili quindi ho ancora bisogno di aiuto.

Matthew Brown aka Lord Matt Matthew Brown aka Lord Matt
6 mag 2019 04:02:10

Sei in grado di capire il modo per ottenere questo? Altrimenti mi piacerebbe lavorare su questo tuo problema. :)

BlueSuiter BlueSuiter
13 giu 2019 10:19:45

Al momento sono completamente bloccato. Lavorare programmaticamente con i post è completamente nuovo per me. Sentiti libero - ho bisogno di tutto l'aiuto possibile.

Matthew Brown aka Lord Matt Matthew Brown aka Lord Matt
13 giu 2019 10:33:31

Devo esaminare il codice che stai scrivendo. Puoi condividere l'accesso a quello?

BlueSuiter BlueSuiter
13 giu 2019 12:28:25
Tutte le risposte alla domanda 2
0

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);
    }
}
13 giu 2019 14:43:02
0

Basandomi sulla risposta accettata alla domanda collegata, penso che qualcosa del genere potrebbe funzionare.

Quindi, in sintesi:

  1. ottieni il contenuto esistente del post con get_post_field
  2. carica l'immagine con wp_insert_attachment che ti darà l'ID dell'immagine
  3. recupera le dimensioni e il testo alternativo (alt) dell'immagine dal contenuto del post in qualche modo
  4. lascia che WordPress generi il markup HTML per l'immagine con wp_get_attachment_image
  5. sostituisci il vecchio segnaposto dell'immagine con il nuovo tag HTML img
  6. 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.

13 giu 2019 14:07:41