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.