Comment redimensionner dynamiquement l'image WordPress à la volée (option de champ / thème personnalisé)

12

Donc - à la demande d'un client, j'ai besoin de pouvoir redimensionner une image non pas de la manière WordPress standard ... mais à partir d'une image tirée d'une option de thème. Je ne peux pas simplement utiliser la zone custom_header, car il y en aura deux ou trois (j'ai également quelques options une fois l'image téléchargée pour permettre à l'utilisateur de choisir le fonctionnement du lien (page, article, catégorie, pas de lien, lien externe) , etc)). J'utilise Options Framework Theme avec beaucoup de succès et je peux très bien récupérer l'image src, il s'agit de savoir si cela peut être utilisé en combinaison avec la fonction add_image_size () normalement utilisée pour les miniatures de message. Je préfère VRAIMENT ne pas suivre la voie timthumb et m'en tenir aux API WordPress (je sais que c'est un peu contradictoire avec ce que je fais en premier lieu ...). Toute aide serait grandement appréciée. Merci!

Zach
la source
1
Ok - je pense que j'ai peut-être accompli cela: <?php $main_image = of_get_option('of_main_image'); $thepost = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE guid = '$main_image'" ) ); $theID = $thepost->ID; echo wp_get_attachment_image( $theID, 'homepage_main' ); ?> quelqu'un voit-il des failles de sécurité ou des bizarreries ici? Cela pourrait aussi être utile pour les autres. Merci!
Zach
Étant donné que le `` guid '' est l'endroit où l'URL de l'image est stockée (le cadre d'options utilise le WooThemes Media Uploader pour stocker ces données en tant que pièce jointe post_type), alors je peux accéder aux données en tant que telles :)
Zach
1
Je viens de l'ajouter pour être complet. Ne devrait pas se fermer, car une autre solution ne nuira pas.
kaiser
1
J'ai rencontré ce problème sur de nombreux sites Web que j'ai créés. Je n'ai pas trouvé de solution qui fonctionne de manière optimale, j'ai donc construit mon propre plugin! J'espère que ça aide! wordpress.org/plugins/fly-dynamic-image-resizer
Junaid Bhura

Réponses:

6

Redimensionnez les images WordPress à la volée à l'aide des fonctions WordPress intégrées.

Utilisez la vt_resizefonction pour redimensionner dynamiquement des images WordPress situées dans un champ personnalisé, une image sélectionnée, un répertoire de téléchargement, un plugin WordGen NextGen Gallery ou même un lien externe vers une image hors site.

Il est très simple à utiliser, il suffit de copier / coller le code ci-dessous dans le functions.phpfichier de votre thème WordPress de votre thème WordPress actuellement activé.

Ensuite, partout où vous avez besoin de redimensionner une image à la volée, il vous suffit d'appeler cette fonction en suivant l'utilisation des paramètres expliquée dans les commentaires de la fonction.

Voici un exemple d'obtention automatique de l'ID de publication, de la publication elle-même, des valeurs de champ personnalisé de la publication et de redimensionnement dynamique de l'image à partir du champ personnalisé contenant l'image à redimensionner dynamiquement à la volée.

<?php
// Place this in your functions.php 
function get_postID(){
    global $wp_query;
    $thePostID = $wp_query->post->ID;
}
?>

<?php
// Place the following lines where you want to perform this action.
$postID = get_postID();// Obtain the current Post ID.
$post = get_post($postID);// Takes the current Post ID and returns the database record.
$custom = get_post_custom($post->ID);// Returns a multidimensional array with all custom fields of the Post.
$image = $custom['field-slug'][0];// Specify the array key of the Custom Field containing the image.
// The first parameter is blank. Meaning, we will not be using a Post Attachment.
// The second parameter is the image from our Post's Custom Field value.
// The third and fourth parameters are the width and height of the image after the re-size is performed.
// The fifth parameter means we want to crop this image.
$resizedImage = vt_resize('', $image, 190, 338, true);// Dynamically re-size our image on the fly.
echo '<img src="'.$resizedImage[url].'" width="'.$resizedImage[width].'" height="'.$resizedImage[height].'" title="'.$post->post_title.'" alt="'.$post->post_title.'" />';// The image properties are held in an array. (Use print_r($resizedImage) for array properties.)
?>

Redimensionner les images WordPress à la volée vt_resize avec prise en charge multisite

  • Description: redimensionnez les images dynamiquement à l'aide des fonctions intégrées de WordPress.
  • Auteur: Victor Teixeira
  • Exigences: PHP 5.2+, WordPress 3.2+

J'ai reformaté le code source afin qu'il soit plus lisible à mes yeux. Si vous voulez le code source formaté d'origine, visitez le lien ci-dessus.

<?php
/*
* Resize images dynamically using wp built in functions
* Victor Teixeira
*
* php 5.2+
*
* Exemplo de uso:
*
* <?php
* $thumb = get_post_thumbnail_id();
* $image = vt_resize($thumb, '', 140, 110, true);
* ?>
* <img src="<?php echo $image[url]; ?>" width="<?php echo $image[width]; ?>" height="<?php echo $image[height]; ?>" />
*
* @param int $attach_id
* @param string $img_url
* @param int $width
* @param int $height
* @param bool $crop
* @return array
*/
if(!function_exists('vt_resize')){
    function vt_resize($attach_id = null, $img_url = null, $width, $height, $crop = false){
    if($attach_id){
        // this is an attachment, so we have the ID
        $image_src = wp_get_attachment_image_src($attach_id, 'full');
        $file_path = get_attached_file($attach_id);
    } elseif($img_url){
        // this is not an attachment, let's use the image url
        $file_path = parse_url($img_url);
        $file_path = $_SERVER['DOCUMENT_ROOT'].$file_path['path'];
        // Look for Multisite Path
        if(file_exists($file_path) === false){
            global $blog_id;
            $file_path = parse_url($img_url);
            if(preg_match('/files/', $file_path['path'])){
                $path = explode('/', $file_path['path']);
                foreach($path as $k => $v){
                    if($v == 'files'){
                        $path[$k-1] = 'wp-content/blogs.dir/'.$blog_id;
                    }
                }
                $path = implode('/', $path);
            }
            $file_path = $_SERVER['DOCUMENT_ROOT'].$path;
        }
        //$file_path = ltrim( $file_path['path'], '/' );
        //$file_path = rtrim( ABSPATH, '/' ).$file_path['path'];
        $orig_size = getimagesize($file_path);
        $image_src[0] = $img_url;
        $image_src[1] = $orig_size[0];
        $image_src[2] = $orig_size[1];
    }
    $file_info = pathinfo($file_path);
    // check if file exists
    $base_file = $file_info['dirname'].'/'.$file_info['filename'].'.'.$file_info['extension'];
    if(!file_exists($base_file))
    return;
    $extension = '.'. $file_info['extension'];
    // the image path without the extension
    $no_ext_path = $file_info['dirname'].'/'.$file_info['filename'];
    $cropped_img_path = $no_ext_path.'-'.$width.'x'.$height.$extension;
    // checking if the file size is larger than the target size
    // if it is smaller or the same size, stop right here and return
    if($image_src[1] > $width){
        // the file is larger, check if the resized version already exists (for $crop = true but will also work for $crop = false if the sizes match)
        if(file_exists($cropped_img_path)){
            $cropped_img_url = str_replace(basename($image_src[0]), basename($cropped_img_path), $image_src[0]);
            $vt_image = array(
                'url'   => $cropped_img_url,
                'width' => $width,
                'height'    => $height
            );
            return $vt_image;
        }
        // $crop = false or no height set
        if($crop == false OR !$height){
            // calculate the size proportionaly
            $proportional_size = wp_constrain_dimensions($image_src[1], $image_src[2], $width, $height);
            $resized_img_path = $no_ext_path.'-'.$proportional_size[0].'x'.$proportional_size[1].$extension;
            // checking if the file already exists
            if(file_exists($resized_img_path)){
                $resized_img_url = str_replace(basename($image_src[0]), basename($resized_img_path), $image_src[0]);
                $vt_image = array(
                    'url'   => $resized_img_url,
                    'width' => $proportional_size[0],
                    'height'    => $proportional_size[1]
                );
                return $vt_image;
            }
        }
        // check if image width is smaller than set width
        $img_size = getimagesize($file_path);
        if($img_size[0] <= $width) $width = $img_size[0];
            // Check if GD Library installed
            if(!function_exists('imagecreatetruecolor')){
                echo 'GD Library Error: imagecreatetruecolor does not exist - please contact your webhost and ask them to install the GD library';
                return;
            }
            // no cache files - let's finally resize it
            $new_img_path = image_resize($file_path, $width, $height, $crop);
            $new_img_size = getimagesize($new_img_path);
            $new_img = str_replace(basename($image_src[0]), basename($new_img_path), $image_src[0]);
            // resized output
            $vt_image = array(
                'url'   => $new_img,
                'width' => $new_img_size[0],
                'height'    => $new_img_size[1]
            );
            return $vt_image;
        }
        // default output - without resizing
        $vt_image = array(
            'url'   => $image_src[0],
            'width' => $width,
            'height'    => $height
        );
        return $vt_image;
    }
}
?>
Michael Ecklund
la source
Voici une fonction beaucoup plus simple (pas de prise en charge multisite, mais est-ce que toute personne sensée
developerbmw
Également une solution utilisable prête github.com/bueltge/WP-Image-Resizer , comme le lien de @kaiser
bueltge
@bueltge, cela fonctionne, mais savez-vous pourquoi les images sont floues? Il semble que toutes les images soient 150x150. Une idée pourquoi cela se produit-il?
Ionut
@bueltge, nevermind. J'ai trouvé le problème. J'ai dû définir la taille à plein comme deuxième paramètre lors de l'utilisationwp_get_attachment_image_url()
Ionut
@bueltge, grattez ça. Il semble que cela ne fonctionne pas ... pouvez-vous m'aider s'il vous plaît? Lorsque j'ajoute la taille d'image car les fullimages ont des tailles différentes.
Ionut