Ajouter la taille de l'image si le modèle de page

11

Je construis 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 me diriger dans la bonne direction, je l'apprécierais vraiment.

    
posée Sammy The Salmon 29.03.2014 - 16:48

4 réponses

12

Cela a toujours été un béguin pour moi - le manque de dimensionnement d'image à la demande, et le nombre de fichiers que vous pouvez créer par la suite si vous avez beaucoup de tailles!

Je peux comprendre la logique qui sous-tend vos efforts. Le problème, c’est que add_image_size n’entre vraiment en jeu qu’au moment de la mise en ligne. En tant que tel, is_page_template(..) sera toujours false .

Un google déterré rapide Aqua Resizer , un script conçu pour résoudre ce problème. Plutôt que d'utiliser add_image_size , vous utilisez aq_resize directement dans votre thème. Si la taille de 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 plusieurs tailles d’image. Vous continuez d’enregistrer la surcharge de WordPress générant toutes les tailles pour toutes les images téléchargées. Elles sont générées à la volée (et mises en cache) à la demande . La différence est que vous pouvez simplement utiliser toutes les fonctions d’image standard et les balises de modèles de WP comme vous le feriez normalement!

De plus, comme l'a mentionné @Waqas, 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 & reconnu 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!

Je souhaite transformer cela en un plug-in qui convertira automatiquement tous les appels add_image_size en un redimensionnement à la demande, alors surveillez cet espace!

    
réponse donnée TheDeadMedic 29.03.2014 - 17:16
3

Si vous souhaitez créer des vignettes à la volée, vous pouvez utiliser outil de redimensionnement d'images Aqua . ce mini script. Les vignettes créées ne seront pas supprimées lors de la suppression d'une 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

.     
réponse donnée wp student 29.03.2014 - 18:00
1

Ce n'est pas une réponse directe à votre problème. Mais je vous aiderai à créer une image en fonction de vos besoins.

Lorsque vous utilisez add_image_size, les images existantes ne sont pas redimensionnées. 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 célèbre classe php qui est utilisée dans de nombreux thèmes premium pour WordPress. C'est ce qu'on appelle Aqua-Resizer.

Vous trouverez plus de détails ici enlace . Wiki: enlace

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 rogner (pour une petite image que votre hauteur ou largeur sont définies), il ne montre rien. Vous pouvez surmonter cette situation en vérifiant si vous obtenez très facilement une valeur nulle après avoir passé l'URL dans cette fonction, 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 manière, vous pouvez vous assurer que l'image spécifique sera générée pour un modèle de page spécifique et que votre site Web sera ainsi beaucoup plus propre.

P.S: cette classe php utilise le système de recadrage principal de WordPress pour éviter les problèmes de sécurité.

    
réponse donnée WpMania.Net 01.04.2014 - 23:17

Lire d'autres questions sur les étiquettes