Remplacer automatiquement l'image d'origine téléchargée par une grande taille

11

Comme nos utilisateurs téléchargent régulièrement des images de ~ 6 Mo à utiliser sur le site Web (et ne savent pas tout d'abord les redimensionner), WordPress enregistre les originaux et les redimensionne à différentes tailles.

Je voudrais une fonction ou un plug-in qui prend l'image téléchargée, la redimensionne à un format plus facile à gérer, puis remplace l'original.

J'ai vu des fonctions qui suppriment l'original mais ne le remplacent pas, ce qui signifie qu'il est impossible de régénérer les vignettes ultérieurement. J'ai besoin de le remplacer pour que l'utilisateur puisse télécharger une image de grande taille. Celle-ci est automatiquement redimensionnée et stockée pour un redimensionnement ultérieur, si nécessaire.

    
posée Shaun 31.08.2012 - 10:59

3 réponses

10

Ajoutez ceci au fichier functions.php du dossier du thème. Il remplace l'image d'origine par la grande image définie dans les paramètres. Vous voudrez peut-être configurer un nouveau format d'image et l'utiliser comme nouvelle taille d'origine.

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');
    
réponse donnée Paul Phillips 15.10.2012 - 17:58
3

Il y a un méchant bug dans la solution ci-dessus. La solution fonctionne comme un charme pour les nouvelles images, mais pour les anciennes images, vous ne devriez jamais comparer à $upload_dir['path'] car c'est le dossier de téléchargement actuel du mois en cours.

Remplacez les éléments suivants:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];
    
réponse donnée timocouckuyt 01.04.2015 - 12:54
2

Puis-je suggérer une mise à jour du code de la réponse ci-dessus? Malheureusement, dans les versions plus récentes de Wordpress, la clé "chemin" n'est plus fournie pour les tailles de fichier. Donc, pour que cela fonctionne avec les anciens envois postaux, nous devons d’abord obtenir le sous-répertoire actuel de l’image originale et l’utiliser pour créer le chemin d’emplacement de la grande image.

Donc remplacez cette ligne:

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

par ces 2 lignes:

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];
    
réponse donnée leendertvb 12.11.2015 - 22:40

Lire d'autres questions sur les étiquettes