change set_post_thumbnail_size according to post type admin page
У меня есть несколько пользовательских размеров миниатюр, и один из них используется в 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' );
Подозреваю, что на этом этапе выполнения кода ещё слишком рано определять, какой тип записи я редактирую.

Более простой способ определить тип записи элемента (который вы редактируете) и загрузить медиафайл в него:
$type = get_post_type($_REQUEST['post_id']);
Как уже отмечалось, iframe загрузки медиафайлов, который отображается во всплывающем окне при попытке загрузить что-либо, не указывает родительскую запись, к которой будет прикреплена новая загрузка. Однако $_REQUEST
все еще активен из окна редактирования и по-прежнему содержит post_id элемента, который вы редактируете — так что просто запросите тип для этого id...
Вы можете использовать этот метод в различных хуках и фильтрах — я использовал фильтр intermediate_image_sizes
для обработки изображений ранее, но не для этой конкретной проблемы, хотя он должен работать и там...

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

В функции 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
.

Я объединил идеи 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;
}

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

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

На случай, если вы не знаете, как реализовать отличную идею @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 > Медиафайлы > Размеры изображений > Размер миниатюры, а не с условным размером, который мы установили для пользовательского типа записи ранее.
