问题描述
我有一些自定义缩略图大小,显然其中一个在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。