Les 'jpeg_quality'
fonctions de hook de filtre acceptent deux arguments: $jpeg_quality
et $function
quelle est la fonction de l'intérieur du hook de filtre est déclenchée et peut être soit image_resize
ou wp_crop_image
. Il n'y a donc aucun moyen de définir sélectivement la qualité des .jpeg
images en fonction de la taille de l'image à partir de cette fonction de crochet de filtre.
Cependant, vous pouvez toujours vous accrocher à un crochet d'action ultérieur dans le processus de téléchargement de pièces jointes et ajuster la .jpeg
qualité d'image des images téléchargées à ce stade en fonction de leur taille spécifique en fonction de vos besoins. Réglez d'abord le jpeg_quality
au maximum pour préserver la qualité de l'image d'origine, puis accrochez-vous au crochet d' added_post_meta
action (qui est déclenché à la fin de l'insertion des métadonnées de pièce jointe) pour ajuster la qualité, comme suit:
// set the quality to maximum
add_filter('jpeg_quality', create_function('$quality', 'return 100;'));
add_action('added_post_meta', 'ad_update_jpeg_quality', 10, 4);
function ad_update_jpeg_quality($meta_id, $attach_id, $meta_key, $attach_meta) {
if ($meta_key == '_wp_attachment_metadata') {
$post = get_post($attach_id);
if ($post->post_mime_type == 'image/jpeg' && is_array($attach_meta['sizes'])) {
$pathinfo = pathinfo($attach_meta['file']);
$uploads = wp_upload_dir();
$dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];
foreach ($attach_meta['sizes'] as $size => $value) {
$image = $dir . '/' . $value['file'];
$resource = imagecreatefromjpeg($image);
if ($size == 'spalsh') {
// set the jpeg quality for 'spalsh' size
imagejpeg($resource, $image, 100);
} elseif ($size == 'spalsh1') {
// set the jpeg quality for the 'splash1' size
imagejpeg($resource, $image, 30);
} else {
// set the jpeg quality for the rest of sizes
imagejpeg($resource, $image, 10);
}
// or you can skip a paticular image size
// and set the quality for the rest:
// if ($size == 'splash') continue;
imagedestroy($resource);
}
}
}
}
Le code ci-dessus affectera uniquement les images nouvellement téléchargées. Si vous souhaitez mettre à jour la qualité des images précédemment téléchargées, vous pouvez utiliser register_activation_hook
des plugins. Créez un nouveau fichier php dans le wp-content/plugins
répertoire et nommez-le comme vous le souhaitez ( update-jpeg-quality.php
par exemple) et ajoutez-lui le code suivant:
<?php
/*
Plugin Name: Update JPEG Quality
Plugin URI: http://wordpress.stackexchange.com/questions/74103/set-jpeg-compression-for-specific-custom-image-sizes
Description: This plugin will change the jpeg image quality according to its size.
Author: Ahmad M
Version: 1.0
Author URI: http://wordpress.stackexchange.com/users/12961/ahmad-m
*/
register_activation_hook(__FILE__, 'ad_modify_jpeg_quality');
function ad_modify_jpeg_quality() {
$attachments = get_posts(array(
'numberposts' => -1,
'post_type' => 'attachment',
'post_mime_type' => 'image/jpeg'
));
if (empty($attachments)) return;
$uploads = wp_upload_dir();
foreach ($attachments as $attachment) {
$attach_meta = wp_get_attachment_metadata($attachment->ID);
if (!is_array($attach_meta['sizes'])) break;
$pathinfo = pathinfo($attach_meta['file']);
$dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];
foreach ($attach_meta['sizes'] as $size => $value) {
$image = $dir . '/' . $value['file'];
$resource = imagecreatefromjpeg($image);
if ($size == 'spalsh') {
// set the jpeg quality for 'spalsh' size
imagejpeg($resource, $image, 100);
} elseif ($size == 'spalsh1') {
// set the jpeg quality for the 'splash1' size
imagejpeg($resource, $image, 30);
} else {
// set the jpeg quality for the rest of sizes
imagejpeg($resource, $image, 10);
}
imagedestroy($resource);
}
}
}
?>
Maintenant, visitez votre page Plugins et cliquez sur activate
le Update JPEG Quality
plugin. Cela parcourra toutes vos .jpeg
images précédemment téléchargées et ajustera leur qualité en fonction des valeurs et des conditions que vous spécifiez dans le plugin. Ensuite, vous pouvez désactiver et supprimer ce plugin en toute sécurité. Veuillez d'abord tester l'environnement de test avant de postuler sur le site de production .