web-dev-qa-db-fra.com

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

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 comment les redimensionner), WordPress enregistre les originaux et les redimensionne en plusieurs tailles.

J'aimerais une fonction ou un plug-in qui prenne l'image téléchargée, la redimensionne à une taille plus gérable, puis remplace l'original.

Certaines fonctions 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 grande image. Celle-ci est automatiquement redimensionnée et stockée pour un redimensionnement ultérieur si nécessaire.

12
Shaun

Ajoutez ceci au fichier functions.php du dossier theme. 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');
10
Paul Phillips

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'];
3
timocouckuyt

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 devrions 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.

Alors 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'];
2
leendertvb