Ajouter une taille d'image si le modèle de page


13

Je crée un site Web pour les membres avec WordPress Multisite. Est-il possible de limiter le nombre d'images générées en fonction du modèle sélectionné?

J'ai essayé les lignes de code suivantes pour générer certaines images sur le modèle de galerie:

// Generate on all uploads
add_theme_support('post-thumbnails');
set_post_thumbnail_size( 1440, 350, true ); 
add_image_size( 'standard_box', 450, 215, true );
add_image_size( 'default_image', 691, 9999 );

// Generate on gallery template only
if ( is_page_template('page-gallery.php') ) {
add_image_size( 'gallery', 900, 9999 );
add_image_size( 'gallery_thumb', 450, 450, true );
}

Cela n'a pas fonctionné. J'ai fait des recherches et je n'arrive pas à trouver quoi que ce soit sur le sujet. Si vous pouviez m'orienter dans la bonne direction, j'apprécierais vraiment.


1
Il existe également le Dynamic Image Resizer d' Otto qui vous permet de définir autant de tailles d'image que vous le souhaitez, mais ne génère une image à une taille particulière que lorsque cela est nécessaire. SO pour votre exemple, les miniatures de la galerie ne seront générées que pour les images qui apparaissent sur le modèle page-gallery.php.
helgatheviking

2
Je veux juste mentionner deux autres excellentes options: le redimensionnement d'image dynamique de @ kaiser et le service Photon dans JetPack.
birgire

Réponses:


13

Cela a toujours été un bug pour moi - le manque de dimensionnement d'image à la demande et le nombre de fichiers que vous pouvez vous retrouver si vous avez beaucoup de tailles!

Je peux voir la logique derrière vos efforts - le problème est add_image_sizeque cela n'entre vraiment en jeu qu'au point de téléchargement. En tant que tel, le is_page_template(..)sera toujours false.

Un rapide Google a déterré Aqua Resizer , un script conçu pour résoudre ce problème. Plutôt que d'utiliser add_image_size, vous utilisez aq_resizedirectement dans votre thème, et si une taille pour l'image n'existe pas, elle est créée et mise en cache à la volée.

En fait, j'ai utilisé une technique similaire, bien que différente, sur plusieurs sites avec de nombreuses tailles d'image. Vous économisez toujours les frais généraux de WordPress générant toutes les tailles pour chaque image téléchargée - elles sont générées à la volée (et mises en cache) au fur et à mesure qu'elles sont demandées. Là où il diffère, c'est que vous pouvez simplement utiliser toutes les fonctions d'image standard et les balises de modèle de WP comme vous le feriez normalement!

De plus, comme @Waqas l'a mentionné, l'utilisation d'Aqua Resizer laissera des fichiers orphelins lorsque vous supprimez une image de votre bibliothèque multimédia. Avec ma technique, tous les fichiers seront supprimés, car ils sont enregistrés dans la base de données et reconnus par WordPress.

/**
 * Resize internally-registered image sizes on-demand.
 *
 * @link    http://wordpress.stackexchange.com/q/139624/1685
 * 
 * @param   mixed   $null
 * @param   int     $id
 * @param   mixed   $size
 * @return  mixed
 */
function wpse_139624_image_downsize( $null, $id, $size ) {
    static $sizes = array(
        'post-thumbnail' => array(
            'height' => 350,
            'width'  => 1440,
            'crop'   => true,
        ),

        'standard_box' => array(
            'height' => 215,
            'width'  => 450,
            'crop'   => true,
        ),

        'default_image' => array(
            'height' => 9999,
            'width'  => 691,
            'crop'   => false,
        ),

        'gallery' => array(
            'height' => 900,
            'width'  => 9999,
            'crop'   => false,
        ),

        'gallery_thumb' => array(
            'height' => 450,
            'width'  => 450,
            'crop'   => true,
        ),
    );

    if ( ! is_string( $size ) || ! isset( $sizes[ $size ] ) )
        return $null;
    if ( ! is_array( $data = wp_get_attachment_metadata( $id ) ) )
        return $null;
    if ( ! empty( $data['sizes'][ $size ] ) )
        return $null;
    if ( $data['height'] <= $sizes[ $size ]['height'] && $data['width'] <= $sizes[ $size ]['width'] )
        return $null;
    if ( ! $file = get_attached_file( $id ) )
        return $null;

    $editor = wp_get_image_editor( $file );

    if ( ! is_wp_error( $editor ) ) {
        $data['sizes'] += $editor->multi_resize(
            array(
                $size => $sizes[ $size ],
            )
        );

        wp_update_attachment_metadata( $id, $data );
    }

    return $null;
}

add_filter( 'image_downsize', 'wpse_139624_image_downsize', 10, 3 );

Et en pratique:

wp_get_attachment_image( $id, 'gallery' ); // Resized if not already
wp_get_attachment_image_src( $id, 'standard_box' ); // Resized if not already
the_post_thumbnail(); // You get the idea!
// And so forth!

J'ai l'intention de transformer cela en un plugin qui convertira automatiquement tous les add_image_sizeappels en redimensionnement à la demande, alors surveillez cet espace!


Merci d'avoir pris le temps de laisser une si bonne réponse. Je vais certainement essayer. Il est important de bien faire les choses avant d'ouvrir mon serveur à plusieurs utilisateurs. Je vais vous crier si j'ai d'autres questions.
Sam

2
J'ai essayé avec the_post_thumbnail (); et cela fonctionne parfaitement. Un problème: lorsque je supprime l'image, elle laisse derrière elle celle qui a été redimensionnée par votre script. Des idées?
Sam

5

3

Si vous voulez créer des pouces à la volée, vous pouvez utiliser le resizer d'image Aqua , mais il y a un inconvénient à ce mini script. Les pouces créés ne seront pas supprimés lors de la suppression de l'image de la bibliothèque. Mais ce n'est pas un gros problème. Si nécessaire, vous pouvez le faire via les commandes SHH


1
Bon point sur les fichiers non supprimés. Ma solution n'en souffrira pas! (voir réponse mise à jour).
TheDeadMedic

1

Ce n'est pas une réponse directe à votre problème. Mais je vais vous aider à faire une image selon vos besoins.

Lorsque vous utilisez add_image_size, il ne redimensionne pas les images existantes. cela ne fonctionne que pour les nouvelles images qui seront téléchargées après l'ajout de votre fonction add_image_size.

Votre code ne générera donc pas de nouvelles images pour la fonction is_page_template.

Mais vous pouvez utiliser une simple classe php pour résoudre votre problème .... c'est une classe php célèbre qui est utilisée pour beaucoup de thèmes premium là-bas pour WordPress. Il s'appelle Aqua-Resizer.

Vous pouvez trouver plus de détails ici https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Problème pouvant survenir:

Cette fonction fonctionne de cette façon ....

<?php aq_resize( $url, $width, $height, $crop, $single ) ?>

Donc quand il ne peut pas recadrer (pour une petite image que votre hauteur ou largeur a définie) il ne montre rien. Vous pouvez surmonter cette situation en vérifiant si vous obtenez une valeur nulle après avoir passé l'URL dans cette fonction très facilement comme la mienne ici ....

<?php 
$thumb = wp_get_attachment_url( get_post_thumbnail_id($post->ID), 'full' ); if($thumb){ $url = aq_resize( $thumb, 400, 200, true, true ); if(!$url){ $url = WPM_DIR.'/assets/images/demo/wrong_image_size.jpg'; } }else{ $url = WPM_DIR.'/assets/images/demo/400x200_no_feature_image.jpg'; } 
?>

De cette façon, vous pouvez vous assurer que l'image spécifique sera générée pour un modèle de page spécifique et de cette façon, votre site Web sera beaucoup plus propre.

PS: cette classe php utilise le système de recadrage de base WordPress donc il n'y a pas de problèmes de sécurité.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.