web-dev-qa-db-fra.com

Différencier l'image en vedette de publier des images lors du téléchargement

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).

5
Howdy_McGee

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.

4
sanchothefat

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();
}
  1. dans ce script, j'ajoute un appel ajax au lien d'image caractéristique qui me notifie que l'utilisateur télécharge une image sélectionnée
  2. je suis en train de définir une méta de publication lorsque l'utilisateur télécharge une image sélectionnée et utilise cette méta de publication pour une vérification conditionnelle afin de générer des tailles spécifiques pour l'image sélectionnée
2
Ravinder Kumar