Je souhaite différencier l'image sélectionnée des images de publication.
Le plan consiste à donner à l'image sélectionnée plusieurs tailles, mais les images à l'intérieur/connectées à la publication n'ont besoin que des tailles par défaut.
Je sais que je peux utiliser intermediate_image_sizes
pour filtrer les types de publication personnalisés affectés à quelles tailles d'image, comme ceci:
/** Don't Make Extra Sizes **/
function post_type_sizes( $image_sizes ){
$post_type_size_array = array('icon', 'med-thumb', 'large', 'full');
$post_image_sizes = array('thumbnail', 'medium', 'large', 'full');
if( isset($_REQUEST['post_id']) && 'cpt_test' === get_post_type($_REQUEST['post_id']) )
return $post_type_size_array;
else
return $post_image_sizes;
return $image_sizes;
}
add_filter('intermediate_image_sizes', 'post_type_sizes', 999 );
Mais je souhaite uniquement attribuer à l'image sélectionnée plusieurs tailles personnalisées et laisser toutes les publications téléchargées dans les tailles par défaut de TinyMCE (vignette, moyen, grand, complet).
Vous pouvez le faire en filtrant la méta-valeur pour _thumbnail_id
.
add_filter( 'update_post_metadata', 'generate_featured_image_sizes', 10, 5 );
add_filter( 'add_post_metadata', 'generate_featured_image_sizes', 10, 5 );
function generate_featured_image_sizes( $check, $object_id, $meta_key, $meta_value, $unique_or_prev ) {
if ( $meta_key == '_thumbnail_id' ) {
// regenerate previous featured image thumbs if it exists
if ( false !== ( $prev_thumb_id = get_post_meta( $object_id, '_thumbnail_id', true ) ) ) {
$prev_new_metadata = wp_generate_attachment_metadata( $prev_thumb_id, get_attached_file( $prev_thumb_id ) );
if ( ! is_wp_error( $prev_new_metadata ) )
wp_update_attachment_metadata( $prev_thumb_id, $prev_new_metadata );
}
// remove all normal image sizes before we add our filter
cleanup_attachment_images( $meta_value );
// filter image sizes for featured
add_filter( 'intermediate_image_sizes', 'featured_image_sizes', 9999 );
// regenerate thumbnails for featured
$new_metadata = wp_generate_attachment_metadata( $meta_value, get_attached_file( $meta_value ) );
if ( ! is_wp_error( $new_metadata ) )
wp_update_attachment_metadata( $meta_value, $new_metadata );
// remove featured sizes from previous featured image
if ( isset( $prev_thumb_id ) && $prev_thumb_id )
cleanup_attachment_images( $prev_thumb_id );
// tidy up
remove_filter( 'intermediate_image_sizes', 'featured_image_sizes', 9999 );
}
return $check;
}
function featured_image_sizes( $sizes ) {
return array( 'large', 'featured', 'slider' );
}
function cleanup_attachment_images( $attachment_id ) {
$uploadpath = wp_upload_dir();
$intermediate_sizes = array();
foreach ( get_intermediate_image_sizes() as $size ) {
if ( $intermediate = image_get_intermediate_size( $attachment_id, $size ) )
$intermediate_sizes[] = $intermediate;
}
// remove intermediate and backup images if there are any
foreach ( $intermediate_sizes as $intermediate ) {
/** This filter is documented in wp-admin/custom-header.php */
$intermediate_file = apply_filters( 'wp_delete_file', $intermediate[ 'path' ] );
@ unlink( path_join( $uploadpath[ 'basedir' ], $intermediate_file ) );
}
}
La recréation des vignettes consiste simplement à générer et à mettre à jour les métadonnées des pièces jointes. Par conséquent, en vous régénérant à chaque modification de l'image sélectionnée, vous obtiendrez l'effet souhaité.
Cela fonctionnera lors du téléchargement, mais également lorsque l’image présentée sera modifiée. De plus, il régénérera les vignettes de l'ancienne vignette, ce qui en fera une nouvelle image.
La raison d'utiliser les crochets add_post_metadata
et update_post_metadata
est pour que nous ayons accès à la valeur actuelle before elle est mise à jour dans la base de données.
NOTEIl n'y a pas de réelle différence entre le menu contextuel d'ajout de média pour l'image sélectionnée et l'éditeur. Ces liens ouvrent simplement le menu contextuel dans un état différent. Il n'est donc pas facile de déterminer quel état a été demandé (image sélectionnée ou éditeur ) lors du chargement des images, d’où l’approche que j’ai montrée ci-dessus.
UPDATEJ'ai ajouté une fonction que vous pouvez appeler pour supprimer des ensembles de vignettes générées pour une pièce jointe. Vous appelez cela avant de générer de nouvelles métadonnées de pièce jointe. Vous pouvez même filtrer les tailles d'image supprimées ou modifier la fonction afin de pouvoir les transmettre en tant qu'argument.
vous pouvez aussi essayer ceci
function post_type_sizes( $image_sizes ){
$feature_image_sizes = array('thumbnail');
// checking for feature image uploading or not
if( isset($_REQUEST['post_id']) && 'post' === get_post_type($_REQUEST['post_id']) && get_post_meta( $_REQUEST['post_id'], 'feature_image_uploading', true ) ){
update_post_meta( $_POST['post_id'],'feature_image_uploading', false );
return $feature_image_sizes;
}
return $image_sizes;
}
add_filter('intermediate_image_sizes', 'post_type_sizes', 999 );
add_action('admin_footer', 'monksinc_notify_feature_image_event', 9999 );
function monksinc_notify_feature_image_event(){
global $pagenow, $post;
if( 'post.php' !== $pagenow && 'post' !== get_post_type( $post->ID ) )
return;
?>
<script>
(function(){
jQuery('#set-post-thumbnail').click(function(e){
e.preventDefault();
jQuery.post(
ajaxurl,
{ action: 'set_post_thumbnail_notify', post_id: jQuery('#post_ID').val() },
function( response ){
console.log(response);
}
);
});
})();
</script>
<?php
}
add_action( 'wp_ajax_set_post_thumbnail_notify', 'set_post_thumbnail_notify_callback' );
function set_post_thumbnail_notify_callback(){
$result = array( 'status'=> 'fail' );
if( isset( $_POST ) && 'set_post_thumbnail_notify' === $_POST['action'] && '' !== $_POST['post_id'] ){
update_post_meta( $_POST['post_id'],'feature_image_uploading', true );
$result = array( 'status'=> 'success' );
}
echo json_encode($result);
die();
}