Générer des miniatures uniquement pour les images sélectionnées

9

Je voudrais savoir s'il existe un moyen simple (code personnalisé ou plugin) de créer des tailles de vignettes uniquement pour les images que j'ai l'intention d'utiliser comme images en vedette (index.php, archive.php, etc.), mais pas pour les images utilisé dans les messages (single.php). Mon objectif principal est de réduire l'utilisation de l'espace serveur en ne créant pas de vignettes que mon thème n'utilisera jamais.

Mes miniatures n'auraient en fait que deux tailles, 720px de large et 328px de large, et les images en vedette de 720px de large (page d'accueil uniquement) auraient également une large de 328px (pour archive.php et sidebar.php)

Actuellement, la seule façon programmatique que je connaisse est de générer des miniatures pour chaque téléchargement d'images , ce qui n'est pas souhaitable, car la plupart de mes téléchargements seront des images publiées et je devrais supprimer beaucoup d'images du serveur manuellement.

Je préfère le code personnalisé aux plugins, mais un plugin serait acceptable. Je sais qu'il existe des plugins de redimensionnement d'image, mais ils n'ont pas été mis à jour depuis longtemps (TimThumb, Dynamic Image Resizer ).

J'ai également trouvé une question similaire ici sur Wordpress SE, mais la réponse acceptée ne résout pas vraiment mon problème.


EDIT: J'ai besoin de supprimer ou d'empêcher les vignettes pour les images à l'intérieur du message, pas pour les images en vedette, c'est-à-dire:

(1) Image en vedette : les vignettes supplémentaires générées automatiquement par WP sont OK.

(2) Images utilisées à l'intérieur des messages : téléchargez l'image d'origine et ne générez pas de tailles supplémentaires. Je recadrerai, redimensionnerai et optimiserai l'image avant de la télécharger et une taille unique conviendra à mes besoins.

imrek
la source
1
Premièrement, il est dit double possible ; deuxièmement, cela pourrait vous aider à résoudre votre problème, car vous pouvez éventuellement l'adapter à vos besoins; Enfin et surtout, il existe une réponse au plug-in »Dynamic Image Resizer«, bien qu'il soit différent.
Nicolai
2
Pas le temps de plonger dedans, mais ce que vous savez, c'est la vignette id - clé méta: _thumbnail_id-, qui devrait être suffisante en fait, save_postet des crochets similaires pourraient être un moyen d'aller. Mais n'oubliez pas que ces images dans votre article peuvent être utilisées dans d'autres articles comme vignette, vous voudrez peut-être avoir un mécanisme pour en tenir compte.
Nicolai
1
Compte tenu de ce que vous avez écrit, les tailles supplémentaires pour l'image sélectionnée ne vous dérangent pas, je pensais davantage: si vous savez laquelle des images jointes est la miniature de la publication / l'image sélectionnée, vous pouvez supprimer les tailles d'image supplémentaires pour les autres. , en excluant l'image sélectionnée de ce processus. J'ai mentionné une restriction / inconvénient possible auparavant.
Nicolai
1
Suggestion: désactivez complètement le redimensionnement via add_filter('intermediate_image_sizes_advanced', '__return_false')puis redimensionnez la miniature à la volée avec Glide
gmazzap

Réponses:

2

Cette fonction générera une image en enregistrant temporairement une taille d'image, en générant l'image (si nécessaire) et en supprimant la taille afin que de nouvelles images ne soient pas créées dans cette taille.

function lazy_image_size($image_id, $width, $height, $crop) {
    // Temporarily create an image size
    $size_id = 'lazy_' . $width . 'x' .$height . '_' . ((string) $crop);
    add_image_size($size_id, $width, $height, $crop);

    // Get the attachment data
    $meta = wp_get_attachment_metadata($image_id);

    // If the size does not exist
    if(!isset($meta['sizes'][$size_id])) {
        require_once(ABSPATH . 'wp-admin/includes/image.php');

        $file = get_attached_file($image_id);
        $new_meta = wp_generate_attachment_metadata($image_id, $file);

        // Merge the sizes so we don't lose already generated sizes
        $new_meta['sizes'] = array_merge($meta['sizes'], $new_meta['sizes']);

        // Update the meta data
        wp_update_attachment_metadata($image_id, $new_meta);
    }

    // Fetch the sized image
    $sized = wp_get_attachment_image_src($image_id, $size_id);

    // Remove the image size so new images won't be created in this size automatically
    remove_image_size($size_id);
    return $sized;
}

C'est "paresseux" car les images ne sont générées que lorsqu'elles sont nécessaires.

Dans votre cas d'utilisation, vous appelleriez cela lazy_image_sizeavec l'ID de miniature de publication pour obtenir une image de la taille souhaitée. Une image serait générée lors du premier appel. Les appels suivants récupéreraient l'image existante.

Gist: https://gist.github.com/mtinsley/be503d90724be73cdda4

Mathew Tinsley
la source
0

Vous pouvez voir ce lien . il y a un exemple comme

add_action( 'after_setup_theme', 'baw_theme_setup' );
function baw_theme_setup() {
  add_image_size( 'category-thumb', 300 ); // 300 pixels wide (and unlimited height)
  add_image_size( 'homepage-thumb', 220, 180, true ); // (cropped)
}
Jakir Hossain
la source
2
J'ai besoin de vignettes uniquement pour certaines images, pas pour tout ce que je télécharge. Fondamentalement, lorsque je télécharge une image, je veux contrôler si les vignettes sont créées ou non.
imrek
mais pourquoi? l'espace de stockage est-il un problème? vraiment difficile d'imaginer cela quand il y a tellement d'espace de stockage disponible.
aequalsb
0

1. Allez dans Tableau de bord> Paramètres> Média
2. Décochez la vignette de recadrage aux dimensions exactes (normalement les vignettes sont proportionnelles)
3.Entrez 0 pour toutes les entrées (0 pour toutes les tailles)
4.Ajoutez-les à vos fonctions.php

// Enable support for Post Thumbnails, and declare sizes.
add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 400, 400, array("center","center") );
function fw_add_image_insert_override($sizes){
    // unset( $sizes['thumbnail']);
    unset( $sizes['small']);
    unset( $sizes['medium']);
    unset( $sizes['large']);
    return $sizes;
}
add_filter('intermediate_image_sizes_advanced', 'fw_add_image_insert_override' );

5. Assurez-vous qu'il n'y a pas de ligne de code dans vos fonctions.php commencez par add_imge_size Remarque:: je suppose que vous utilisez une taille de 400x400 pour votre miniature Maintenant, lorsque vous téléchargez une photo, elle ne créera que 2 versions au lieu d'au moins 4 versions photo comme précédemment.

Trang
la source
0

Salut - j'ai eu un problème similaire. Woocommerce utilise des images de catalogue pour les images de catalogue et de produits associés. Ce n'est pas idéal, car vous perdez la qualité ou la vitesse de l'image. J'ai donc essayé d'ajouter une quatrième catégorie d'images pour mes produits connexes. Howdy McGee a résolu le problème. Veuillez consulter la réponse de Howdy McGees:

Modifier les tailles d'image de produit connexes: lisez son code !

Il a parfaitement fonctionné pour mes besoins. Pour votre problème, la même logique pourrait être appliquée. J'espère que cela t'aides. salutations - theo

J'ai trouvé une solution qui fonctionne. 1. étape: attribuez une nouvelle taille de vignette dans votre functions.php. Vérifiez la référence: wp codex !

/*add your custom size*/
add_action( 'after_setup_theme', 'your_theme_setup' );
function your_theme_setup() {
add_image_size( 'your-thumb', 123, 123, true );//insert your values
}

Remarque: «votre pouce», vous utiliserez ce nom de variable plus tard

  1. étape: Ajoutez ensuite le code suivant où vous voulez afficher vos produits phares:

    <h1>featured products</h1> 
    <div class="woocommerce">
    <ul class= "products">
    
    <?php
    $args = array( 'post_type' => 'product', 'meta_key' => '_featured','posts_per_page' => 4,'columns' => '4', 'meta_value' => 'yes' );
     $loop = new WP_Query( $args );
    
     while ( $loop->have_posts() ) : $loop->the_post(); global $product; ?>
    
                    <li class="product post-<?php echo get_the_ID(); ?>">    
                        <a href="<?php echo get_permalink( $loop->post->ID ) ?>" title="<?php echo esc_attr($loop->post->post_title ? $loop->post->post_title : $loop->post->ID); ?>">
    
                            <?php woocommerce_show_product_sale_flash( $post, $product ); ?>
                            <?php if (has_post_thumbnail( $loop->post->ID )) echo get_the_post_thumbnail($loop->post->ID, 'your-thumb'); else echo '<img src="'.woocommerce_placeholder_img_src().'" alt="Placeholder" width="123px" height="123px" />'; ?></a>
                            <h3><?php the_title(); ?></h3><span class="price"><?php echo $product->get_price_html(); ?></span>
    
                    </li>
    
    <?php endwhile; ?>
    <?php wp_reset_query(); ?> 
    </ul>
    </div>

Référence et infos: pas assez de réputation pour un troisième lien, désolé (www.haloseeker.com/display-woocommerce-featured-products-without-a-shortcode/) Je l'ai placé dans l'index.php (ma page d'accueil) de wootheme mystile . N'oubliez pas d'utiliser «votre pouce» en ligne:

<?php if (has_post_thumbnail( $loop->post->ID )) echo get_the_post_thumbnail($loop->post->ID, 'your-thumb'); else echo '<img src="'.woocommerce_placeholder_img_src().'" alt="Placeholder" width="123px" height="123px" />'; ?></a>
  1. étape: régénérez les vignettes, utilisez le plugin https://wordpress.org/plugins/regenerate-thumbnails/

  2. rafraîchir le navigateur et inspecter le dom et comparer les valeurs

Selon votre thème, vous pouvez changer le balisage et les noms de classe. J'ai testé la méthode ci-dessus et cela fonctionne bien. La seule chose que je n'ai pas pu faire jusqu'à présent est d'ajouter le bouton ajouter au panier, car je ne sais pas comment écrire une variable dans le shortcode du bouton ajouter au panier. Voici le code:

<?php echo do_shortcode('[add_to_cart id="variable number?"]'); ?>

J'espère que ça aide. Il existe certainement une manière plus élégante de procéder. Par exemple avec une fonction dans le functions.php

en ce qui concerne theo

timholz
la source
0

pour empêcher WordPress de créer des tailles supplémentaires pour certaines images uniquement, vous devez avoir un moyen d'indiquer qu'une image que vous allez télécharger ne sera utilisée que dans un but particulier. cela doit se produire AVANT de le télécharger.

comme il n'y a pas d'interface (prête à l'emploi) pour indiquer de telles options lors d'une action de téléchargement, vous ne pouvez pas empêcher la génération d'image supplémentaire - à moins qu'un plug-in n'ait ajouté cette fonctionnalité.

mais pourquoi diable ne voudriez-vous pas des tailles d'image supplémentaires? vous ne savez jamais quand vous pouvez rencontrer une situation où vous souhaitez utiliser une taille différente de n'importe quelle image. êtes-vous préoccupé par l'espace de stockage?

ne pouvez-vous pas utiliser vos propres spécifications de taille comme celle-ci? the_post_thumbnail( array(100, 100) );

la plupart des réponses et des commentaires que j'ai lus ici expliquent comment personnaliser l'environnement WordPress pour les tailles d'image, mais aucun ne mentionne le faire sous condition. en outre, aucun d'entre eux ne traite du fait que vous devez être en mesure d'indiquer l'utilisation d'une image avant de la télécharger.

si vous essayez de compenser une image trop petite ou une image trop grande dans un message, vous pouvez utiliser quelques éléments.

  1. CSS: vous pouvez ajouter des entrées à votre feuille de style, par exemple .post-entry img { max-width:200px; max-height:300px; }, c'est plus universel et efficace que de compter sur la taille de l'image elle-même - C'EST BEAUCOUP de temps Photoshop.

  2. Modèle: vous pouvez modifier le fichier de modèle où la sortie HTML des publications est générée et spécifier une taille d'image comme celle-ci:

voir cette documentation sur WordPress: https://codex.wordpress.org/Function_Reference/the_post_thumbnail

aequalsb
la source