Je souhaite ajouter des tailles d'image personnalisées à l'utilitaire de téléchargement multimédia:
Pour ce faire, j'utilise le code suivant (les commentaires sont là pour plus de commodité):
// this function adds the custom image sizes to the media uploader
function my_insert_custom_image_sizes( $sizes ) {
// get the custom image sizes
global $_wp_additional_image_sizes;
// if there are none, just return the built-in sizes
if ( empty( $_wp_additional_image_sizes ) )
return $sizes;
// add all the custom sizes to the built-in sizes
foreach ( $_wp_additional_image_sizes as $id => $data ) {
// take the size ID (e.g., 'my-name'), replace hyphens with spaces,
// and capitalise the first letter of each Word
if ( !isset($sizes[$id]) )
$sizes[$id] = ucfirst( str_replace( '-', ' ', $id ) );
}
return $sizes;
}
// define the init function next, which sets up all the necessary stuff
function custom_image_setup () {
add_theme_support( 'post-thumbnails' );
add_image_size( 'my-size1', 250, 250 );
add_image_size( 'my-size2', 350, 350 );
add_image_size( 'my-size3', 450, 450 );
add_filter( 'image_size_names_choose', 'my_insert_custom_image_sizes' );
}
// attach that init function to the 'after_setup_theme' hook
// so it runs on each page load once your theme's been loaded
add_action( 'after_setup_theme', 'custom_image_setup' );
Ce code fonctionne bien. À côté d'un problème: lors du téléchargement d'une image, si celle-ci est inférieure aux dimensions de la plus petite taille d'image personnalisée, cette erreur apparaît: Invalid argument supplied for foreach()
.
Je suppose que le problème vient de la fonction my_insert_custom_image_sizes
. Donc, fondamentalement, lorsqu'aucune image personnalisée n'est créée, l'erreur apparaît. Comment puis-je réparer cela? J'ai le sentiment que le problème est quelque chose de simple que j'ai négligé mais je suis perdu ...
Si vous souhaitez reproduire cette erreur, collez simplement le code ci-dessus dans des fonctions et chargez une image dont la taille est inférieure à 250x250 en pixels.
UPDATE: après quelques recherches supplémentaires, il semble que l'erreur soit liée à foreach dans ma fonction de compression JPEG:
// Set JPEG compression quality
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') {
$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 == 'large') {
// set the jpeg quality for 'large' size
imagejpeg($resource, $image, 35);
} elseif ($size == 'medium') {
// set the jpeg quality for the 'medium' size
imagejpeg($resource, $image, 35);
} elseif ($size == 'small') {
// set the jpeg quality for the 'small' size
imagejpeg($resource, $image, 40);
} else {
// set the jpeg quality for the rest of sizes
imagejpeg($resource, $image, 90);
}
imagedestroy($resource);
}
}
}
}
Des idées sur ce qui ne va pas?
Invalid argument supplied for foreach
signifie que le X dans foreach X as ...
n'est pas un tableau. Vous pouvez empêcher cette erreur en tapant le type; ajoutez (array)
avant l'argument dans l'instruction foreach. Cela transformera votre variable en tableau, essentiellement. Dans votre code, le changement serait ...
foreach ( (array) $attach_meta['sizes'] as $size => $value ) {
Maintenant, gardez à l'esprit que cela ne résoudra pas le vrai problème, à savoir que votre code s'attend à ce que $attach_meta['sizes']
soit un tableau et ce n'est pas le cas. Vous voudrez peut-être refactoriser votre code pour gérer ce scénario.