change set_post_thumbnail_size according to post type admin page

29 дек. 2010 г., 23:35:28
Просмотры: 6.3K
Голосов: 7

У меня есть несколько пользовательских размеров миниатюр, и один из них используется в set_post_thumbnail_size, что напрямую влияет на интерфейс в админке.

Я хочу перехватывать, на какой странице админки (для определённого типа записи) я нахожусь, и устанавливать разные размеры в указанной функции. В основном, я хочу реализовать следующее:

function setup_the_theme() {

    add_theme_support( 'post-thumbnails' );

        if ($post_type == 'type_A'){
            set_post_thumbnail_size( 298, 167, true ); //портретная ориентация
        } else {
            set_post_thumbnail_size( 192, 108, true ); //альбомная ориентация
        }

    add_image_size( 'top_articles', 298, 167, true ); //портретная ориентация
    add_image_size( 'article_thumb', 203, 114, true ); //портретная ориентация
    add_image_size( 'featured_articles', 60, 200, true ); //альбомная ориентация

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

Подозреваю, что на этом этапе выполнения кода ещё слишком рано определять, какой тип записи я редактирую.

2
Комментарии

Можете ли вы отредактировать ваш вопрос, чтобы описать конечную цель? То, о чем вы спрашиваете, выглядит скорее как идея реализации, а не конечный результат. Вполне возможно, есть способ достичь того, что вам нужно, без изменения set_post_thumbnail_size().

Chip Bennett Chip Bennett
20 окт. 2013 г. 18:01:14

@ChipBennett довольно старый вопрос, думаю, мне бы хотелось иметь возможность задавать разные миниатюры для разных типов записей в админке при редактировании custom_post_type. Возможно что-то вроде set_post_thumbnail_size(width, height, crop, post_type)..

Amit Amit
20 нояб. 2013 г. 03:15:25
Все ответы на вопрос 5
2
11

Более простой способ определить тип записи элемента (который вы редактируете) и загрузить медиафайл в него:

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

Как уже отмечалось, iframe загрузки медиафайлов, который отображается во всплывающем окне при попытке загрузить что-либо, не указывает родительскую запись, к которой будет прикреплена новая загрузка. Однако $_REQUEST все еще активен из окна редактирования и по-прежнему содержит post_id элемента, который вы редактируете — так что просто запросите тип для этого id...

Вы можете использовать этот метод в различных хуках и фильтрах — я использовал фильтр intermediate_image_sizes для обработки изображений ранее, но не для этой конкретной проблемы, хотя он должен работать и там...

30 дек. 2010 г. 06:25:14
Комментарии

Я не думаю, что это работает... Фильтр intermediate_image_sizes вызывается в async-upload.php, который не загружается с параметрами $_REQUEST... поэтому мне пришлось проверять их раньше и находить место для сохранения значения в моем примере.

goldenapples goldenapples
30 дек. 2010 г. 07:46:28

На самом деле, ты прав. Он там есть. Очень ловко... Я проверял GET-параметры раньше, но не подумал, что они могут быть переданы через POST.

goldenapples goldenapples
30 дек. 2010 г. 19:47:53
0

В функции wp_generate_attachment_metadata есть фильтр intermediate_image_sizes. Проблема в том, что тип записи не передается в контексте. Вот один из способов обойти эту проблему, устанавливая временное значение (transient) с типом записи во всплывающем окне загрузки медиафайлов:

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;

}

Думаю, это должно сработать, хотя, вероятно, есть более элегантный способ, чем использование временных значений (transient). К тому же, текущее решение не идеально — одновременная загрузка нескольких изображений может привести к пересечению типов записей, а изображения, загруженные через панель "Новое медиа", могут унаследовать тип записи от последнего загруженного изображения на экране редактирования записи.

Может, кто-то сможет предложить улучшение?

Редактирование:

Я знал, что должен быть лучший способ. Игнорируйте функцию, подключенную к admin_head-media-upload-popup, и следуйте ответу @somatic для проверки типа записи. Вы по-прежнему можете задавать размер миниатюры в зависимости от типа записи в фильтре intermediate_image_sizes_advanced.

30 дек. 2010 г. 00:54:04
2

Я объединил идеи Somatic и Goldenapples (спасибо, ребята!) следующим образом. Это работает отлично и очень просто в реализации.

Код нужно добавить в файл functions.php

/* Добавление размеров изображений */
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;
}
22 окт. 2015 г. 09:35:01
Комментарии

Так что если вы загружаете изображение прямо из медиабиблиотеки, оно будет создано только в стандартных размерах, но если загружать медиафайл в режиме редактирования записи, изменять или добавлять изображение, оно будет сгенерировано во всех форматах для данного типа записи? Так ли это?

Luca Reghellin Luca Reghellin
15 авг. 2017 г. 14:46:18

Вам нужно загружать медиафайлы, находясь на странице редактирования записи. Изменение изображения и повторное сохранение, похоже, не приводит к генерации ожидаемых размеров.

TheTrueTDF TheTrueTDF
16 авг. 2017 г. 04:32:17
0

Я повторю раннее ответ на похожий вопрос:

Невозможно задать размеры изображений на основе типа записи, так как изображения еще не прикреплены к записи в момент их загрузки и создания промежуточных размеров (когда вы добавляете их через "Медиафайлы", они вообще не прикреплены ни к какой записи).

Однако, в этом ответе содержится информация о плагинах, которые я написал, и вместе они, вероятно, могут сделать то, что вам нужно: использовать несколько размеров изображений, но создавать только те, которые вы действительно используете.

29 дек. 2010 г. 23:49:18
0

На случай, если вы не знаете, как реализовать отличную идею @somatic, вот как это можно сделать.

Код нужно добавить в functions.php вашей темы:

if ( ! function_exists( 'wpse6103_setup' ) )
{
  function wpse6103_setup() {

    // Другие настройки темы и регистрация функций

    add_theme_support( 'post-thumbnails' );

      /*
       * Основано на: http://wordpress.stackexchange.com/a/6123
       */
      if( ! empty( $_REQUEST[ 'post_id' ] ) && ctype_digit( $_REQUEST[ 'post_id' ] ) ) {

        /*
         * Проверяем, является ли тип записи 'book'. Если да, устанавливаем размер миниатюры
         * 300 x 150. Если нет, используем размеры, определенные для миниатюр в
         * Консоль WordPress > Медиафайлы > Размеры изображений > Размер миниатюры.
         */
        if( get_post_type( 'book' == $_REQUEST[ 'post_id' ] ) ) {
          set_post_thumbnail_size( 300, 150, false );
        }

      }

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

Затем для вывода миниатюры записи в шаблоне можно использовать следующий код:

<?php

  if ( has_post_thumbnail() ) {

    if( 'aahank_book' == get_post_type() ) {

      echo wp_get_attachment_image( get_post_thumbnail_id( $post->ID ), array( 300, 150 ), false, array( 'class' => 'img-thumbnail' ) );

    } else {

      the_post_thumbnail( 'thumbnail', array( 'class' => 'img-thumbnail' ) );

    }

  }

?>

Как я вижу, обычная функция the_post_thumbnail() здесь не подойдет, потому что она всегда будет выводить изображение с размером, установленным в Консоли WordPress > Медиафайлы > Размеры изображений > Размер миниатюры, а не с условным размером, который мы установили для пользовательского типа записи ранее.

20 окт. 2013 г. 17:58:34