web-dev-qa-db-fra.com

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

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

11
Sam

Cela a toujours été une source d'insectes 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’est véritablement en jeu qu’au moment de l’envoi. En tant que tel, is_page_template(..) sera toujours false.

Un rapide google creusé 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, et 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 de nombreuses tailles d'image. Vous enregistrez toujours les frais généraux générés par WordPress every taille pour chaque images téléchargées - elles sont générées à la volée (& mis en cache) au fur et à mesure de leur demande. La différence réside dans le fait que vous pouvez simplement utiliser toutes les fonctions d’image standard et les balises de modèle de WP comme vous le feriez normalement!

En outre, 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, les fichiers all 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 appels add_image_size en un redimensionnement à la demande, alors surveillez cet espace!

12
TheDeadMedic

Si vous voulez créer des vignettes à la volée, vous pouvez utiliser Aqua image resizer , mais ce mini script présente un inconvénient. 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 Commandes SHH

3
wp student

Ce n'est pas une réponse directe à votre problème. Mais je vais vous aider à faire 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.

Donc, votre code ne générera 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 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 rogner (pour une petite image que votre hauteur ou largeur ont 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 que votre site Web sera ainsi beaucoup plus propre.

P.S: cette classe php utilise le système de culture principal de WordPress afin qu’il n’y ait pas de problèmes de sécurité.

1
WpMania.Net