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

时间:2014-03-29 作者:Sam

我正在用WordPress Multisite建立一个会员网站。是否可以根据所选模板限制生成的图像数量?

我已尝试使用以下代码行在gallery模板上生成某些图像:

// 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 );
}
这不管用。我做了一些研究,似乎找不到关于这个问题的任何东西。如果你能给我指出正确的方向,我将非常感激。

4 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

对我来说,这一直是一个问题-缺少按需调整图像大小,如果有很多大小,则会产生大量文件!

我能理解你努力背后的逻辑-问题是,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 调用按需调整大小,请注意此空间!

SO网友:Nicolai Grossherr
SO网友:wp student

如果要在飞行中创建拇指,可以使用Aqua image resizer, 但是这个小脚本有一个缺点。从库中删除图像时,不会删除创建的拇指。但这没什么大不了的。如果需要,您可以通过SHH commands

SO网友:WpMania.Net

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

使用add\\u image\\u size时,不会调整现有图像的大小。它仅适用于添加add\\u image\\u size功能后将上载的新图像。

因此,您的代码不会为is\\u page\\u模板函数生成新图像。

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

您可以在此处找到更多详细信息https://github.com/syamilmj/Aqua-ResizerWiki:https://github.com/syamilmj/Aqua-Resizer/wiki

Problem that may arise:

此函数的工作方式如下。。。。

<?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\'; } 
?>
通过这种方式,您可以确保为特定页面模板生成特定图像,这样您的网站将更加干净。

P、 这个php类使用WordPress核心裁剪系统,所以没有安全问题。

结束

相关推荐

If is_single in functions.php

我希望删除wpautop筛选器仅对我博客中的帖子起作用。因为在某些页面,我需要autop,而在某些页面,我需要它不在那里。我使用以下规则,这是在我的主题函数中。php:remove_filter( \'the_content\', \'wpautop\' ); 因为我只想在博客上看到它,所以我在考虑if语句,我在Wordpress中搜索了条件标记页面,发现我可以使用is\\u single。但它不起作用。这是我现在使用的代码。if(is_single() ){ remove_f