Функции 'jpeg_quality'
ловушки фильтра принимают два аргумента: $jpeg_quality
и $function
которая является функцией из ловушки фильтра, запускается и может быть либо image_resize
или wp_crop_image
. Таким образом, нет возможности выборочно установить качество .jpeg
изображения в соответствии с размером изображения с помощью этой функции фильтра фильтра.
Тем не менее, вы все еще можете подключиться к более позднему действию в процессе загрузки вложений и отрегулировать .jpeg
качество изображения загруженных изображений в этой точке в соответствии с их конкретным размером в соответствии с вашими потребностями. Сначала установите jpeg_quality
максимальное значение, чтобы сохранить исходное качество изображения, затем подключите к added_post_meta
действию ловушку (которая запускается в конце вставки метаданных вложения), чтобы отрегулировать качество следующим образом:
// 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);
}
}
}
}
Приведенный выше код повлияет только на вновь загруженные изображения. Если вы хотите обновить качество ранее загруженных изображений, вы можете использовать register_activation_hook
плагины. Создайте новый php-файл в wp-content/plugins
каталоге и назовите его как хотите ( update-jpeg-quality.php
например) и добавьте в него следующий код:
<?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);
}
}
}
?>
Теперь зайдите на страницу плагинов и нажмите activate
на Update JPEG Quality
плагин. Это зациклит все ваши ранее загруженные .jpeg
изображения и отрегулирует их качество в соответствии со значениями и условиями, указанными в плагине. Затем вы можете безопасно деактивировать и удалить этот плагин. Пожалуйста , проверьте на тестирование среды первой перед нанесением на производственную площадку .
if
утверждение наelseif
. Смотрите мое обновление.Invalid argument supplied for foreach()
. Таким образом, в основном, когда пользовательское изображение не создается, появляется ошибка. Вы знаете, как решить эту проблему?$attach_meta['sizes']
ожидается, что это будет массив, в то время как в этом случае это не так. В большинстве случаев это должно произойти, и это может произойти, только если у нас нет пользовательских размеров изображения, и мы не указываем размеры изображения по умолчанию в Настройках -> Настройки мультимедиа . Чтобы обезопасить себя и убедиться , что у нас есть массив можно добавить проверку перед передачей его вforeach
петлю:if (is_array($attach_meta['sizes']))
. Пожалуйста, смотрите обновленный код.if ( $post->post_mime_type == 'image/jpeg' )
а теперь этоif ( $post->post_mime_type == 'image/jpeg' && is_array($attach_meta['sizes']) )