web-dev-qa-db-fra.com

Nouvelle version de taille d'image uniquement pour le fichier Image sélectionnée

Je m'inquiète du trop grand nombre de fichiers créés lors de l'ajout d'une nouvelle taille d'image.

Tous les fichiers téléchargés généreront la nouvelle taille, J'ai besoin d'une taille d'image spécifique uniquement pour le fichier défini comme image Fetured, existe-t-il un moyen de le faire? .

Les vignettes , moyennes , etc. sont ok, mais il n’est pas nécessaire de créer la nouvelle taille pour chaque fichier.

Je pense que cela devrait fonctionner juste après la définition de l'image sélectionnée.

6
Diana

Recherche

La question Filtre pour l'image sélectionnée mène à cette réponse: Comment accrocher update_post_meta et delete_post_meta? .

Couplé à la variable globale fine ($_wp_additional_image_sizes) révélée ici: Comment obtenir une liste de toutes les tailles de vignettes possibles définies dans un thème , amenez-nous au code qui saisit l'action "Utiliser comme image sélectionnée".

enter image description here


Code

Ce code est déclenché à chaque clic "Utiliser comme image sélectionnée". Il passe ensuite en revue toutes les tailles d'image supplémentaires et les supprime, en conservant celles par défaut de WordPress (miniature, moyenne, grande).
Testez ce codede bout en boutavant de devenir LIVE.
Code GPL. Aucune garantie accordée. Vérifiez les commentaires.

/**
    DRAWBACK
    - Setting the Featured Image can be done ONLY ONCE
    -- When first setting the FI, all other attachments intermediate sizes will be deleted
    -- If swapping the FI, the first image's remaining intermediate will be deleted, and the second DON'T HAVE any additional intermediates!

    TODO: Restoring deleted intermediates
    - this post may have an answer: https://wordpress.stackexchange.com/a/8082/12615
*/

add_action( 'added_post_meta', 'wpse_57369_selective_delete_intermediates', 10, 4 );
add_action( 'updated_post_meta', 'wpse_57369_selective_delete_intermediates', 10, 4 );

/**
 * Catches the "Used as featured image" action
*/
function wpse_57369_selective_delete_intermediates( $meta_id, $post_id, $meta_key, $meta_value )
{
    if ( '_thumbnail_id' == $meta_key )
    {
        global $_wp_additional_image_sizes;

       /**
        * The global holds all additional image sizes and contains this:
        * 
           array(
           ['post-thumbnail'] => array(
               ['width'] => 1000
               ['height'] => 288
               ['crop'] => 1
           )
           ['large-feature'] => array(
               ['width'] => 1000
               ['height'] => 288
               ['crop'] => 1
           )
           ['small-feature'] => array(
               ['width'] => 500
               ['height'] => 300
               ['crop'] =>
           )
        )
       */

        // Populate a new array with single values based on the keys of the global
        $all_sizes = array();
        foreach ( $_wp_additional_image_sizes as $key => $value )
        {
            $all_sizes[] = $key;
        }

        // Retrieve all attachments of current post/page/cpt
        $all_attachs = get_children( array(
                'post_parent' => $post_id,
                'post_type' => 'attachment',
                'numberposts' => -1,
                'post_mime_type' => 'image'
            ));

        // Determine upload path
        $uploads   = wp_upload_dir();
        $path_pos  = strpos( $uploads['basedir'], 'wp-content/' ); // start position of the string
        $base_path = substr( $uploads['basedir'], 0, $path_pos);  // path before wp-content, e.g., /etc/public_html/

        // Loop through all attachments
        foreach ( $all_attachs as $key => $value )
        {
            // This is the featured image
            if ( $key == $meta_value)
            {
                wpse_57369_delete_files( $key, $all_sizes, $base_path, 'small-feature' );
            }
            // Rest of attached images
            else
            {
                wpse_57369_delete_files( $key, $all_sizes, $base_path, false );
            }
        }
    }
}

/**
 * Delete all custom intermediates files, except when $keep_size is defined
*/
function wpse_57369_delete_files( $ID, $all_sizes, $base_path, $keep_size=false )
{
    foreach ( $all_sizes as $intermediate )
    {
        /* We need to know the image url [0] and if it exists [3] */
        $the_url = wp_get_attachment_image_src( $ID, $intermediate );

        /* If additional image exist, go ahead */
        if( $the_url[3] )
        {
            // Path of the image to be deleted
            $url_pos  = strpos( $the_url[0], 'wp-content/' );
            $url_end  = substr( $the_url[0], $url_pos);

            // Delete all intermediates
            if ( !$keep_size )
            {
                // loga( $ID . ' - ' . $intermediate, 'delete-me');
                unlink( $base_path . $url_end );
            }

            // Featured image, Selective delete
            else
            {
                // Delete intermediate
                if ( $intermediate != $keep_size )
                {
                    // loga( $ID . ' - ' . $intermediate, 'delete-me');
                    unlink( $base_path . $url_end );                    
                }

                // Keep intermediate, no action needed
                // PROBABLY, RESTORING AN INEXISTENT IMAGE SIZE MUST BE DONE HERE
                else
                {
                    // loga( $ID . ' - ' . $intermediate, 'keep-me');
                }
            } 
        }
    }
}

function loga()
{
    // This is the FireBug FirePHP console call
    // http://www.firephp.org/HQ/Use.html
}

Résultat

Contenu du dossier après le téléchargement _ images, aucune image d'entité n'est encore définie
enter image description here

Contenu du dossier après réglagefondo-restauraciones en tant qu'image sélectionnée
enter image description here


Autres notes

Pour gérer TOUTES les tailles d’image supplémentaires (valeurs par défaut de WordPress et définies par l'utilisateur), utilisez:

$all_sizes = get_intermediate_image_sizes();

/**
 * $all_images contains all intermediate image sizes, WordPress default and declared custom sizes:
 * 
    array(
        [0] => 'thumbnail'
        [1] => 'medium'
        [2] => 'large'
        [3] => 'post-thumbnail'
        [4] => 'large-feature'
        [5] => 'small-feature'
    )
*/
4
brasofilo

Vous pouvez obtenir l'image sélectionnée src/source en utilisant les arguments suivants sur la fonction principale (où $post doit être appelé avec global $post devant):

wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );

Comment l'utiliser

J'ai écrit un free plugin disponible sur GitHub , appelé "Dynamic Image Resize".

Vous pouvez le télécharger et l'utiliser gratuitement.

Petit code

Placez [dynamic_image] dans votre contenu. Le shortcode a quatre arguments:

  • src Chemin d'accès complet à l'image dans votre répertoire de téléchargement ou à l'ID
  • width Valeur entière
  • height Valeur entière
  • classes Css classes - séparées par un espace

… Mais il y a aussi un:

Tag de modèle

global $post;
// Use the template tag with ID *OR* full path
dynamic_image_resize( array(
     // The full path to the image in your uploads folder
     'src'     => wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
     // OR: the ID
     'src'     => get_post_thumbnail_id( $post->ID )

    ,'width'   => 60
    ,'height'  => 100
    ,'classes' => 'some classes to align and style the image'
) );

Il suffit de le déposer dans votre modèle là où vous en avez besoin et de terminer.

Remarque: Il est basé sur une idée/proposition de Konstantin Kovshenin.


Sidenote:

Si vous souhaitez ignorer/désactiver les tailles d'image par défaut, ajoutez simplement 0 en tant que width et height dans les paramètres d'administration.

4
kaiser