Remplace automatiquement l'image importée d'origine par une grande taille d'image

13

Comme nos utilisateurs téléchargent régulièrement des images de ~ 6 Mo à utiliser sur le site Web (et ne savent pas trop comment les redimensionner en premier), WordPress stocke les originaux ainsi que leur redimensionnement dans plusieurs tailles différentes.

J'aimerais une fonction ou un plugin qui prend l'image téléchargée, la redimensionne en quelque chose de plus gérable, puis remplace l'original.

J'ai vu certaines fonctions qui suppriment l'original mais ne le remplacent pas, ce qui signifie qu'il est impossible de régénérer les vignettes à une date ultérieure. J'ai besoin que cela soit remplacé pour que l'utilisateur puisse télécharger une grande image et qu'elle soit automatiquement redimensionnée et stockée pour un redimensionnement ultérieur si nécessaire.

Shaun
la source

Réponses:

10

Ajoutez-le au fichier functions.php dans le dossier du thème. Il remplace l'image d'origine par la grande image définie dans les paramètres. Vous souhaiterez 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');
Paul Phillips
la source
1
Si cette solution fonctionne, il serait très utile de faire un plugin.
Alexey
Je viens de réessayer, mais j'ai d'abord ajouté une nouvelle taille (appelée 'fullsize') qui était de 2048x1536 (deux fois plus grande que j'en ai besoin) et maintenant tout fonctionne, les images originales sont enregistrées en seulement deux fois grand comme j'en ai besoin (que je veux garder pour l'avenir) au lieu de plusieurs fois. Merci!
Shaun
Super truc, content que ça ait marché pour vous!
Paul Phillips
Ce code a tout supprimé de mon fichier functions.php. J'ai vérifié dans l'éditeur WP et dans FTP et le fichier était vide. J'ai dû restaurer le fichier à partir d'une sauvegarde. :(
jlg
1
@Ciprian Vous devez configurer un script pour les parcourir tous. Je suis sûr qu'il existe un moyen WordPress d'obtenir toutes les informations sur les pièces jointes, mais $ wpdb-> get_col ('SELECT id FROM wp_posts WHERE post_type = "attachment" ORDER BY id'); fonctionnerait pour obtenir une liste des ID de publication pour les images. Ajoutez peut-être: AND post_mime_type = "image / jpeg" aussi pour limiter aux jpegs seulement. L'emplacement réel de chaque image est conservé dans wp_postmeta.
Paul Phillips
3

Il y a un bug méchant 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 ce qui suit:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];
timocouckuyt
la source
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, le «chemin» de la clé n'est plus fourni pour les tailles de fichier. Donc, pour le faire fonctionner sur les anciens téléchargements de messages, nous devons d'abord obtenir le sous-répertoire actuel de l'image d'origine et l'utiliser pour créer le chemin de l'emplacement de la grande image.

Remplacez donc 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'];
leendertvb
la source
0

J'ai posté ceci sur une autre question très similaire ici, mais j'ai pensé que cela valait la peine d'être republié.

J'ai eu des problèmes avec le code ci-dessus et ce qui a fonctionné pour moi a essentiellement changé ces lignes .:

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

avec:

    $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";
    }

J'ai posté mon code complet et plus d'explications ici: Supprimer l'image d'origine - garder la vignette?

Pitchpole
la source