Как динамически изменять размер изображения WordPress на лету (настраиваемое поле / опция темы)

12

Итак, по требованию клиента мне нужно иметь возможность изменить размер изображения не стандартным способом WordPress ... но из изображения, извлеченного из опции темы. Я не могу просто использовать область custom_header, так как их будет два или три (у меня также есть несколько опций после загрузки изображения, чтобы позволить пользователю выбрать, как должна работать ссылка (страница, публикация, категория, ссылка отсутствует, внешняя ссылка) , и т.д)). Я использую Options Framework Theme с большим успехом, и я могу получить изображение src просто отлично, вопрос в том, можно ли это как-то использовать в сочетании с функцией add_image_size (), обычно используемой для миниатюр постов. Я ДЕЙСТВИТЕЛЬНО предпочел бы не идти по пути Timthumb и придерживаться API WordPress (я знаю, что это немного противоречит тому, что я делаю в первую очередь ...). Любая помощь будет принята с благодарностью. Благодарность!

Zach
источник
1
Хорошо, я думаю, что, возможно, достиг этого: <?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' ); ?> Кто-нибудь видит здесь какие-нибудь дыры в безопасности или странности? Может быть полезным и для других. Благодарность!
Зак
Так как в 'guid' хранится URL-адрес изображения (в Framework Options используется WooThemes Media Uploader для хранения этих данных в виде post_type вложения), я могу получить доступ к данным как таковым :)
Зак
1
Просто добавил это для полноты. Не следует закрывать, так как другое решение не навредит.
Кайзер
1
Я сталкивался с этой проблемой на многих сайтах, которые я создал. Я не мог найти решение, которое работает оптимальным образом, поэтому я создал свой собственный плагин! Надеюсь, это поможет! wordpress.org/plugins/fly-dynamic-image-resizer
Джунаид Бхура,

Ответы:

6

Изменение размера изображений WordPress на лету с помощью встроенных функций WordPress.

Используйте vt_resizeфункцию для динамического изменения размера изображений WordPress, расположенных в настраиваемом поле, избранном изображении, каталоге загрузки, плагине NextGen Gallery WordPress или даже внешней ссылке на внешнее изображение.

Его очень просто использовать, просто скопируйте / вставьте приведенный ниже код в functions.phpфайл вашей темы WordPress текущей активированной темы WordPress.

Затем, где бы вам ни понадобилось изменить размер изображения на лету, просто вызовите эту функцию, следуя использованию параметра, описанному в комментариях к функции.

Ниже приведен пример автоматического получения идентификатора публикации, самой публикации, значений настраиваемого поля для публикации и динамического изменения размера изображения из настраиваемого поля, содержащего изображение, для динамического изменения размера на лету.

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

Изменение размера изображений WordPress на лету vt_resize с поддержкой нескольких сайтов

  • Описание: динамическое изменение размера изображений с помощью встроенных функций WordPress.
  • Автор: Виктор Тейшейра
  • Требования: PHP 5.2+, WordPress 3.2+

Я переформатировал исходный код, чтобы он был более читабельным для моих глаз. Если вы хотите оригинальный форматированный исходный код, перейдите по ссылке выше.

<?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;
    }
}
?>
Майкл Эклунд
источник
Вот гораздо более простая функция (без поддержки нескольких сайтов, но кто-нибудь в здравом уме использует несколько сайтов?) Github.com/BrettMW/img_resize
developerbmw
Также готовое к использованию решение github.com/bueltge/WP-Image-Resizer , например, ссылка @kaiser
bueltge
@ Bueltge, это работает, но у вас есть идея, почему изображения размыты? Кажется, он делает все изображения 150х150. Есть идеи, почему это происходит?
Ionut
@ Bueltge, неважно. Я нашел проблему. Мне пришлось установить размер на полный в качестве второго параметра при использованииwp_get_attachment_image_url()
Ionut
@ Bueltge, поцарапайте это. Кажется, что это не работает ... не могли бы вы помочь мне с этим? Когда я добавляю размер fullизображения, так как изображения имеют разные размеры.
Йонут