изменить set_post_thumbnail_size в соответствии с страницей администратора пост
-
16-10-2019 - |
Вопрос
У меня есть несколько пользовательских миниатюр, и, очевидно, один из них используется в 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 ); //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, когда вы пытаетесь загрузить что -то, не указывает на родительский пост, к которому будет прикреплена новая загрузка. Но $_REQUEST
все еще активен в окне «Редактировать» и все еще содержит POST_ID элемента, который вы редактируете - так что просто запрашивайте тип для этого идентификатора ...
Вы можете использовать эту технику в различных крючках и фильтрах - я использовал intermediate_image_sizes
Фильтр для обработки изображений раньше, но не для этой конкретной проблемы, но она должна там работать ...
Другие советы
Есть intermediate_image_sizes
Фильтр в функции wp_generate_attachment_metadata. Анкет Проблема в том, что у него нет типа поста, проходящего в рамках контекста. Вот один из способов обойти эту проблему, установив переход со значением типа поста в всплывающем окне «Загрузка медиа -загрузки»:
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" может наследовать тип поста с последнего изображения, загруженного на экране почты.
Может, кто -то сможет улучшить это?
Редактировать:
Я знал, что должен быть лучший способ сделать это. Игнорировать функцию, зацещенную admin_head-media-upload-popup
и следуйте ответу @Somatic для проверки типа поста. Вы все еще можете установить размер пост-месяцы на основе типа Post In intermediate_image_sizes_advanced
.
Я смешал идеи Somatic и Goldenpples (спасибо, ребята!) Следующим образом. Он работает как очарование и действительно просто реализовать.
Это должно быть написано в функциях.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;
}
я повторю более ранний ответ на аналогичный вопрос:
Невозможно основать размеры изображений на типе пост, так как изображения еще не прикреплены к сообщению, когда вы загружаете их, и создаются промежуточные размеры изображений (когда вы просто добавляете их через «новые носители», они даже не прикреплены на любой пост вообще).
Однако этот ответ содержит информацию о плагины, которые я написал Это, вероятно, может сделать то, что вы хотите: использовать несколько размеров изображений, но создайте только используемые вами изображения.
На случай, если вы не знаете, как реализовать отличную идею @Somatic, вот как это сделать.
Код займет функции вашей темы. Php:
if ( ! function_exists( 'wpse6103_setup' ) )
{
function wpse6103_setup() {
// Other theme defaults and register functions
add_theme_support( 'post-thumbnails' );
/*
* Based on: http://wordpress.stackexchange.com/a/6123
*/
if( ! empty( $_REQUEST[ 'post_id' ] ) && ctype_digit( $_REQUEST[ 'post_id' ] ) ) {
/*
* Check if post type is 'book'. If yes, set the thumbnail size to
* 300 x 150. If not, obey the sizes defined for thumbnail in
* WordPress Dashboard > Media > Image sizes > Thumbnail size.
*/
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 Dashboard > СМИ > Размеры изображений > Размер миниатюры И не условный размер изображения, который мы устанавливаем для пользовательского типа Post ранее.