J'ai une série d'articles, tous avec des images en vedette, mais je dois pouvoir personnaliser le recadrage en haut à droite. Dans ce cas, j’ai besoin de les rogner en haut à droite, mais il serait utile de savoir comment positionner moi-même ce point.
À l’heure actuelle, la fonction add_image_size () tire son contenu du centre de l’image. Pas toujours jolie !!
La génération d'images intermédiaires est extrêmement rigide. image_resize()
le garde près du code et manque complètement de crochets.
En gros, la seule option possible consiste à se connecter à wp_generate_attachment_metadata
et à écraser l’image générée par WP avec la vôtre (ce qui nécessitera un peu de fonction image_resize()
).
J'ai besoin de cela pour le travail afin de pouvoir partager du code ultérieurement.
Ok, voici un exemple approximatif, mais pratique. Notez que pour configurer le recadrage de cette manière, vous devez comprendre la fonction imagecopyresampled()
.
add_filter('wp_generate_attachment_metadata', 'custom_crop');
function custom_crop($metadata) {
$uploads = wp_upload_dir();
$file = path_join( $uploads['basedir'], $metadata['file'] ); // original image file
list( $year, $month ) = explode( '/', $metadata['file'] );
$target = path_join( $uploads['basedir'], "{$year}/{$month}/".$metadata['sizes']['medium']['file'] ); // intermediate size file
$image = imagecreatefromjpeg($file); // original image resource
$image_target = wp_imagecreatetruecolor( 44, 44 ); // blank image to fill
imagecopyresampled($image_target, $image, 0, 0, 25, 15, 44, 44, 170, 170); // crop original
imagejpeg($image_target, $target, apply_filters( 'jpeg_quality', 90, 'image_resize' )); // write cropped to file
return $metadata;
}
Wordpress codex a la réponse, son ci-dessous.
Définissez la taille de l'image en la coupant et en définissant une position de recadrage:
add_image_size( 'custom-size', 220, 220, array( 'left', 'top' ) ); // Hard crop left top
Lorsque vous définissez une position de rognage, la première valeur du tableau est la position de rognage de l'axe x, la seconde est la position de rognage de l'axe y.
x_crop_position accepte "gauche", "centre" ou "droite". y_crop_position accepte 'haut', 'centre' ou 'bas'. Par défaut, ces valeurs sont définies par défaut au centre lorsque vous utilisez le mode de rognage difficile.
Et aussi le codex fait référence à une page qui montre comment les positions des cultures agissent.
http://havecamerawilltravel.com/photographer/wordpress-thumbnail-crop
J'ai développé une solution à ce problème qui ne nécessite pas de piratage du coeur: http://bradt.ca/archives/image-crop-position-in-wordpress/
J'ai également soumis un correctif à core: http://core.trac.wordpress.org/ticket/19393
Ajoutez-vous en tant que Cc sur le ticket pour montrer votre soutien pour que cela soit ajouté au noyau.
Vous pouvez utiliser le plugin Thumbnail Crop Position pour sélectionner la position de recadrage de vos vignettes.
Solution alternative ici: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-worder-with-native-cropping-cropping-tool/
Ajoutez simplement ce code au fichier functions.php, puis utilisez le plug-in "Regenerate Thumbnails" ( https://wordpress.org/plugins/regenerate-thumbnails/ ):
function px_image_resize_dimensions( $payload, $orig_w, $orig_h, $dest_w, $dest_h, $crop ){
// Change this to a conditional that decides whether you want to override the defaults for this image or not.
if( false )
return $payload;
if ( $crop ) {
// crop the largest possible portion of the original image that we can size to $dest_w x $dest_h
$aspect_ratio = $orig_w / $orig_h;
$new_w = min($dest_w, $orig_w);
$new_h = min($dest_h, $orig_h);
if ( !$new_w ) {
$new_w = intval($new_h * $aspect_ratio);
}
if ( !$new_h ) {
$new_h = intval($new_w / $aspect_ratio);
}
$size_ratio = max($new_w / $orig_w, $new_h / $orig_h);
$crop_w = round($new_w / $size_ratio);
$crop_h = round($new_h / $size_ratio);
$s_x = 0; // [[ formerly ]] ==> floor( ($orig_w - $crop_w) / 2 );
$s_y = 0; // [[ formerly ]] ==> floor( ($orig_h - $crop_h) / 2 );
} else {
// don't crop, just resize using $dest_w x $dest_h as a maximum bounding box
$crop_w = $orig_w;
$crop_h = $orig_h;
$s_x = 0;
$s_y = 0;
list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );
}
// if the resulting image would be the same size or larger we don't want to resize it
if ( $new_w >= $orig_w && $new_h >= $orig_h )
return false;
// the return array matches the parameters to imagecopyresampled()
// int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h
return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h );
}
add_filter( 'image_resize_dimensions', 'px_image_resize_dimensions', 10, 6 );