問題描述

我有一些自定義縮圖大小,顯然其中一個在 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。