изменить set_post_thumbnail_size в соответствии с страницей администратора пост

wordpress.stackexchange https://wordpress.stackexchange.com/questions/6103

  •  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 ранее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top