Sostituisci automaticamente l'immagine caricata originale con immagini di grandi dimensioni


13

Poiché i nostri utenti caricano regolarmente ~ 6 MB di immagini da utilizzare sul sito Web (e non hanno familiarità con il modo di ridimensionarle prima), WordPress memorizza gli originali e li ridimensiona in diverse dimensioni.

Vorrei una funzione o un plug-in che prende l'immagine caricata, la ridimensiona a qualcosa di più gestibile e quindi sostituisce l'originale.

Ho visto alcune funzioni che eliminano l'originale ma non lo sostituiscono, il che significa che è impossibile rigenerare le anteprime in un secondo momento. Ho bisogno di questo per essere sostituito in modo che l'utente possa caricare un'immagine di grandi dimensioni che viene automaticamente ridimensionata e memorizzata per il ridimensionamento futuro, se necessario.

Risposte:


10

Aggiungi questo al file Functions.php nella cartella del tema. Sostituisce l'immagine originale con l'immagine grande impostata nelle impostazioni. Potresti voler impostare un nuovo formato immagine e utilizzarlo come nuova dimensione originale.

function replace_uploaded_image($image_data) {
      // if there is no large image : return
  if (!isset($image_data['sizes']['large'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  // $large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file']; // ** This only works for new image uploads - fixed for older images below.
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  // delete the uploaded image
  unlink($uploaded_image_location);

  // rename the large image
  rename($large_image_location,$uploaded_image_location);

  // update image metadata and return them
  $image_data['width'] = $image_data['sizes']['large']['width'];
  $image_data['height'] = $image_data['sizes']['large']['height'];
  unset($image_data['sizes']['large']);

  return $image_data;
}

add_filter('wp_generate_attachment_metadata','replace_uploaded_image');

1
Se questa soluzione funziona, sarebbe molto utile creare un plugin.
— Alexey,

Ho appena provato di nuovo, ma prima ho aggiunto una nuova dimensione (chiamata "fullsize") che era 2048x1536 (due volte più grande di cui ho bisogno) e ora funziona tutto, le immagini originali vengono salvate solo il doppio grande come ho bisogno di loro (che voglio conservare per il futuro) invece che molte volte. Grazie!
— Shaun,

Roba fantastica, felice che abbia funzionato per te!
— Paul Phillips,

Questo codice ha cancellato tutto dal mio file Functions.php. Ho controllato nell'editor WP e in FTP e il file era vuoto. Ho dovuto ripristinare il file da un backup. :(
— jlg

1
@Ciprian Dovresti impostare uno script per scorrere tutti. Sono sicuro che esiste un modo WordPress per ottenere tutte le informazioni sugli allegati tranne $ wpdb-> get_col ('SELEZIONA ID DA wp_posts DOVE post_type = "allegato" ORDINA PER ID'); funzionerebbe per ottenere un elenco di ID post per le immagini. Forse aggiungi: AND post_mime_type = "image / jpeg" anche per limitare solo a jpegs. La posizione effettiva di ogni immagine è contenuta in wp_postmeta.
— Paul Phillips,

3

C'è un brutto bug nella soluzione sopra. La soluzione funziona come un incantesimo per le nuove immagini, ma per le vecchie immagini, non dovresti mai confrontarti $upload_dir['path']perché è la cartella di upload corrente del mese corrente.

Sostituisci quanto segue:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

2

Posso suggerire un aggiornamento al codice della risposta sopra? Sfortunatamente nelle versioni più recenti di Wordpress il 'percorso' chiave non è più fornito per le dimensioni del file. Quindi, per farlo funzionare su caricamenti di post più vecchi, dovremmo prima ottenere il sottodir corrente dall'immagine originale e usarlo per rendere il percorso della posizione per l'immagine di grandi dimensioni.

Quindi sostituisci questa linea:

$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

con queste 2 righe:

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

0

Ho pubblicato questo su un'altra domanda molto simile qui ma ho pensato che valesse la pena ripubblicare.

Ho avuto problemi con il codice sopra e ciò che ha funzionato per me stava essenzialmente cambiando queste linee .:

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);

con:

    $file_to_be_copied = $large_image_location; 
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\n";
    }

Ho pubblicato il mio codice completo e ulteriori spiegazioni qui: eliminare l'immagine originale - mantenere l'anteprima?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.