Jak dynamicznie zmieniać rozmiar obrazu WordPress w locie (opcja pola niestandardowego / motywu)

12

Tak więc - na życzenie klienta potrzebuję mieć możliwość zmiany rozmiaru obrazu nie w standardowy sposób WordPress ... ale z obrazu pobranego z opcji motywu. Nie mogę po prostu użyć obszaru custom_header, ponieważ będą dwa lub trzy (po przesłaniu obrazu mam też kilka opcji, które pozwalają użytkownikowi wybrać sposób działania linku (strona, post, kategoria, brak linku, link zewnętrzny itp.)). Używam Theme Framework Theme z wielkim sukcesem i mogę dobrze pobrać obraz src, to kwestia, czy można go w jakiś sposób użyć w połączeniu z funkcją add_image_size () zwykle używaną do miniatur postów. NAPRAWDĘ wolałbym nie iść na czas i trzymać się interfejsów API WordPress (wiem, że to trochę sprzeczne z tym, co robię w pierwszej kolejności ...). Każda pomoc byłaby bardzo mile widziana. Dzięki!

Zach
źródło
1
Ok - myślę, że mogłem to zrobić: <?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' ); ?> ktoś widzi tu jakieś dziury w zabezpieczeniach lub dziwactwa? Może być przydatny także dla innych. Dzięki!
Zach.
Ponieważ w „guid” jest przechowywany adres URL obrazu (Framework opcji używa WooThemes Media Uploader do przechowywania tych danych jako załącznika typu post_typ), mogę uzyskać dostęp do danych jako takich :)
Zach.
1
Właśnie dodałem to dla kompletności. Nie należy się zamykać, ponieważ inne rozwiązanie nie zaszkodzi.
kaiser
1
Napotkałem ten problem na wielu stronach internetowych, które zbudowałem. Nie mogłem znaleźć rozwiązania, które działa w optymalny sposób, więc zbudowałem własną wtyczkę! Mam nadzieję, że to pomoże! wordpress.org/plugins/fly-dynamic-image-resizer
Junaid Bhura

Odpowiedzi:

6

Zmień rozmiar obrazów WordPress w locie za pomocą wbudowanych funkcji WordPress.

Użyj tej vt_resizefunkcji, aby dynamicznie zmienić rozmiar obrazów WordPress znajdujących się w niestandardowym polu, polecanym obrazie, katalogu do przesyłania, wtyczce WordPress Galerii NextGen, a nawet zewnętrznym łączu do obrazu poza witryną.

Jest bardzo prosty w użyciu, wystarczy skopiować / wkleić poniższy kod do functions.phppliku motywu WordPress aktualnie aktywowanego motywu WordPress.

Następnie, gdy zajdzie potrzeba zmiany rozmiaru obrazu w locie, po prostu wywołaj tę funkcję zgodnie z użyciem parametru wyjaśnionym w komentarzach funkcji.

Oto przykład automatycznego pobierania identyfikatora posta, samego posta, wartości pola niestandardowego postu i dynamicznej zmiany rozmiaru obrazu z pola niestandardowego zawierającego obraz, który ma być dynamicznie zmieniany w trakcie pracy.

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

Zmień rozmiar obrazów WordPress w locie vt_resize dzięki obsłudze wielu witryn

  • Opis: Dynamicznie zmieniaj rozmiar obrazów za pomocą wbudowanych funkcji WordPress.
  • Autor: Victor Teixeira
  • Wymagania: PHP 5.2+, WordPress 3.2+

Ponownie sformatowałem kod źródłowy, aby był bardziej czytelny na własne oczy. Jeśli chcesz oryginalnie sformatowany kod źródłowy, odwiedź powyższy link.

<?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
źródło
Jest to znacznie prostsza funkcja (brak obsługi wielu witryn, ale czy ktoś przy zdrowych zmysłach korzysta z wielu witryn?) Github.com/BrettMW/img_resize
developerbmw
Również gotowe użyteczne rozwiązanie github.com/bueltge/WP-Image-Resizer , takie jak link z @kaiser
bueltge 1'15
@bueltge, to działa, ale czy masz pojęcie, dlaczego obrazy są rozmyte? Wygląda na to, że wszystkie obrazy mają wymiary 150 x 150. Wiesz, dlaczego tak się dzieje?
Ionut
@bueltge, nevermind. Znalazłem problem. Jako drugi parametr musiałem ustawić pełny rozmiarwp_get_attachment_image_url()
Ionut
@bueltge, podrap to. Wygląda na to, że to nie działa ... czy możesz mi w tym pomóc? Kiedy dodam rozmiar obrazu, ponieważ fullobrazy mają różne rozmiary.
Ionut