如何动态调整WordPress图像的大小(自定义字段/主题选项)


12

所以-根据客户的要求,我需要能够调整图像的大小,而不是标准的WordPress方法...而是从主题选项中提取的图像。我不能简单地使用custom_header区域,因为会有两个或三个区域(上传图片后,我还有一些选择,可以让用户选择链接的工作方式(页面,帖子,类别,无链接,外部链接)等))。我正在使用Options Framework Theme取得了巨大的成功,并且可以很好地检索图像src,这是可以与常规用于缩略图的add_image_size()函数结合使用的问题。我宁愿不走捷径,也不要坚持使用WordPress API(我知道这与我一开始所做的有点矛盾……)。任何帮助将不胜感激。谢谢!


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' ); ?> 有人在这里看到任何安全漏洞或奇怪之处吗?可能对其他人也有用。谢谢!
扎克(Zach)

由于“ guid”是图像URL的存储位置(选项框架使用WooThemes Media Uploader将该数据存储为附件post_type),因此我可以这样访问数据:)
扎克


1
刚刚添加此内容是为了完整性。不应该被关闭,因为另一种解决方案也不会造成伤害。
kaiser 2012年

1
我在建立的许多网站上都遇到过这个问题。我找不到最佳解决方案,所以我建立了自己的插件!我希望这有帮助!wordpress.org/plugins/fly-dynamic-image-resizer
Junaid Bhura 2015年

Answers:


6

使用内置的WordPress函数即时调整WordPress图像的大小。

使用该vt_resize功能可以动态调整自定义字段中的WordPress图像,特色图像,上载目录,NextGen Gallery WordPress插件甚至是指向非现场图像的外部链接的大小。

使用非常简单,只需将以下代码复制/粘贴到functions.php当前激活的WordPress主题的WordPress主题 文件中。

然后,在需要动态调整图像大小的任何地方,只需按照函数注释中说明的参数用法对该函数进行调用即可。

这是一个示例,该示例自动获取帖子ID,帖子本身,帖子的自定义字段值,并从包含要动态调整大小的图像的“自定义字段”中动态调整图像的大小。

<?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内置函数动态调整图像大小。
  • 作者: Victor Teixeira
  • 要求: 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,它可以工作,但是您知道为什么图像模糊吗?看来它使所有图像均为150x150。知道为什么会这样吗?
Ionut,2017年

@bueltge,没关系。我发现了问题。使用时,我不得不将尺寸设置为全尺寸作为第二个参数wp_get_attachment_image_url()
Ionut

@bueltge,刮一下。似乎无法正常工作...您能帮我这个忙吗?当我添加图像尺寸时,full图像具有不同的尺寸。
Ionut
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.