问题描述

我有一些自定义缩略图大小,显然其中一个在 set_post_thumbnail_size 中使用,这直接影响管理区域中的界面。

我想要做的是截取我所在的管理页面 (对于 post-type),并在上述功能中设置不同的大小,所以基本上我想要这样做:

function setup_the_theme() {

    add_theme_support( 'post-thumbnails' );

        if ($post_type == 'type_A'){
            set_post_thumbnail_size( 298, 167, true ); //portrait
        } else {
            set_post_thumbnail_size( 192, 108, true ); //landscape
        }

    add_image_size( 'top_articles', 298, 167, true ); //portrait
    add_image_size( 'article_thumb', 203, 114, true ); //portrait
    add_image_size( 'featured_articles', 60, 200, true ); //landscape

}
add_action( 'after_setup_theme', 'setup_the_theme' );

我怀疑在这个周期中太早了解我正在编辑哪个帖子类型。

最佳解决方案

找出您正在编辑的项目的帖子类型并将媒体上传到的更简单的方法:

$type = get_post_type($_REQUEST['post_id']);

如上所述,当您尝试上传某些内容时,Lightbox 重叠式广告中显示的媒体上传 iframe 不会指示新上传将附加到的父帖子。但是 $_REQUEST 仍然在编辑窗口中处于活动状态,并且仍然包含您正在编辑的项目的 post_id,因此只需查询该 ID 的类型即可

您可以使用这种技术在各种钩子和过滤器 – 我已经使用 intermediate_image_sizes 过滤器进行图像处理,但不是为了这个特殊的问题,但它应该在那里工作吗?

次佳解决方案

功能 wp_generate_attachment_metadata 中有一个 intermediate_image_sizes 过滤器。问题是,它没有作为上下文的一部分传递的帖子类型。通过在媒体上传弹出窗口中设置一个具有帖子类型值的瞬态功能,可以解决这个问题:

add_action( 'admin_head-media-upload-popup', 'define_post_type' );

function define_post_type() {
    $referring_string = explode('?',$_SERVER['HTTP_REFERER']);
    if ($referring_string[1]) parse_str( $referring_string[1] );
    else $post_type = 'post';
    set_transient('current_upload_parent_type',$post_type);
}

add_filter( 'intermediate_image_sizes_advanced', 
     'set_thumbnail_size_by_post_type', 10);

function set_thumbnail_size_by_post_type( $sizes ) {

    $post_type = get_transient( 'current_upload_parent_type' );
    delete_transient( 'current_upload_parent_type' );

    switch ($post_type) :
        case 'type_A' :
            $sizes['post-thumbnail'] = array( 
                         'width' => 298, 'height' => 167, 'crop' => true);
            break;
        default :
            $sizes['post-thumbnail'] = array( 
                         'width' => 192, 'height' => 108, 'crop' => true);
            break;
    endswitch;

    return $sizes;

}

我认为这应该是诀窍,虽然这可能是一个更优雅的方式,而不是设置一个瞬态 (和它是,它不是防弹的 – 两个同时的图像上传有风险,让他们的帖子类型交叉,图像上传通过」New Media」 面板可以从 post screen 上传的最后一个图像继承 post 类型。

也许有人可以改善这个?

编辑:

我知道必须有一个更好的方法来做到这一点。忽略挂在 admin_head-media-upload-popup 上的功能,并按照 @somatic 的答案检查帖子类型。您仍然可以根据 intermediate_image_sizes_advanced 中的帖子类型设置 post-thumbnail 大小。

第三种解决方案

我混合了 Somatic 和 Goldenapples 的想法 (谢谢你们),以下方式。它的作用就像一个魅力,实现起来很简单。

它应该写在 functions.php 中

/* Adding image sizes*/
add_filter( 'intermediate_image_sizes_advanced','set_thumbnail_size_by_post_type', 10);
function set_thumbnail_size_by_post_type( $sizes ) {

    $post_type = get_post_type($_REQUEST['post_id']);

    switch ($post_type) :
        case 'service' :
            $sizes['service'] = array( 
                'width' => 250,
                'height' => 155,
                'crop' => true
            );    
        break;
        case 'post' :
            $sizes['post'] = array( 
                'width' => 250,
                'height' => 210,
                'crop' => true
            );
        break;
        default :
            $sizes['default'] = array( 
                'width' => 200,
                'height' => 200,
                'crop' => true
            );
    endswitch;

    return $sizes;
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。