如果页面模板添加图像大小


13

我正在使用WordPress Multisite建立会员网站。是否可以根据所选模板限制生成多少图像?

我已经尝试了以下几行代码以在图库模板上生成某些图像:

// 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 );
}

这没有用。我已经进行了一些研究,但似乎找不到任何关于该主题的信息。如果您能指出正确的方向,我将不胜感激。


1
奥托(Otto)的动态图像调整器Dynamic Image Resizer)可让您定义所需的图像大小,但仅在需要时才生成特定大小的图像。因此,在您的示例中,画廊缩略图只会针对page-gallery.php模板上显示的图像生成。
helgatheviking 2014年

2
只想提及其他两个不错的选择:@kaiser 的动态图像调整大小和JetPack中的Photon服务
birgire 2014年

Answers:


13

这一直是我的烦恼-缺少按需调整图像大小,如果文件大小很多,最终可能会产生大量文件!

我可以看到您的努力背后的逻辑-问题是,add_image_size只有在上载点真正发挥作用。因此,is_page_template(..)永远是false

一个快速的Google挖出了Aqua Resizer,该脚本旨在解决此问题。add_image_size您可以aq_resize直接在主题中使用而不是使用,并且如果图像的大小不存在,则会即时创建并缓存该图像。

实际上,我在具有许多图像尺寸的几个站点上使用了相似的技术,尽管有所不同。您仍然可以节省WordPress的开销,因为它可以为上传的每个图像生成每种尺寸的图像-它们是在请求时即时生成(并缓存)的。不同之处在于,您可以像往常一样简单地使用WP的所有标准图像功能和模板标签!

另外,正如@Waqas所提到的,当您从媒体库中删除图像时,使用Aqua Resizer会留下孤立的文件。使用我的技术,所有文件都将被删除,因为它们已保存到数据库并被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 );

在实践中:

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!

我打算将其变成一个插件,该插件将自动将所有add_image_size调用转换为按需调整大小,因此请留意这个空间!


感谢您抽出宝贵的时间来回答这个问题。我一定会尝试一下。在向多位用户开放服务器之前,请务必正确使用此功能。如果有其他问题,我会大声疾呼。
萨姆

2
我通过the_post_thumbnail()进行了尝试。而且效果很好。一个问题:当我删除图像时,它留下了被脚本重新调整大小的图像。有任何想法吗?
2014年

5


免责声明:
-这不是真正的答案。
-这旨在帮助您与您的话题更多的研究。
-此外,它反映一个-至少毡-类似问题有关类似问题最近出现得更频繁。


有关此主题的有关Wordpress开发的其他信息:

注意:此列表不以任何方式排列且不完整。


3

如果您想即时创建缩略图,则可以使用Aqua图像缩放器,但是此迷你脚本有一个缺点。从库中删除图像后,创建的缩略图将不会删除。但这没什么大不了的。如果需要,您可以通过SHH命令执行此操作


1
关于不删除文件的要点。我的解决方案不会因此受到影响!(请参阅更新的答案)。
TheDeadMedic 2014年

1

这不是您问题的直接答案。但我会帮助您根据需要制作图像。

使用add_image_size时,它不会调整现有图像的大小。它仅适用于添加add_image_size函数后将要上传的新图像。

因此,您的代码不会为is_page_template函数生成新图像。

但是您可以使用一个简单的php类来解决您的问题...。这是一个著名的php类,用于WordPress的许多高级主题。它被称为Aqua-Resizer。

您可以在这里找到更多详细信息https://github.com/syamilmj/Aqua-Resizer Wiki:https : //github.com/syamilmj/Aqua-Resizer/wiki

可能出现的问题:

此功能以这种方式工作。

<?php aq_resize( $url, $width, $height, $crop, $single ) ?>

因此,当无法裁剪时(对于您定义的高度或宽度的小图像),它什么也不显示。您可以通过像我的这里一样非常容易地在此函数中传递url后检查您是否正在获取空值来克服这种情况。

<?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'; } 
?>

这样,您可以确保为特定的页面模板生成特定的图像,从而使您的网站更加整洁。

PS:此php类使用WordPress核心裁剪系统,因此没有安全性问题。

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.