Requisitos mínimos de dimensões para imagem em destaque?

13

Estou criando um site de beisebol com vários autores. Da experiência passada, não importa quão bem você conheça alguém pessoalmente, isso não significa que eles seguirão ou até mesmo lerão suas instruções.

Dito isso, gostaria de solicitar que qualquer imagem que um Autor decidir "Usar como imagem em destaque" tenha no mínimo 640 pixels de largura e um mínimo de 360 pixels de altura.

Eu solicitei que cada postagem tenha uma Imagem em destaque usando o plug-in WyPiekacz ; a postagem não será publicada sem uma imagem em destaque. Eu bloqueei a possibilidade de um autor fazer hotlink para outro site por remover a guia "De URL" em Adicionar mídia usando o código da Bainternet.

Agora, preciso exigir que qualquer imagem usada como imagem em destaque seja de pelo menos 640 px por 360 px. Não sou um programador, mas tenho andado a brincar e a tentar usar o código do Maor Barazany como ponto de partida, mas sem sucesso. O código dele força dimensões mínimas para qualquer imagem carregada .

    
por Travis Pflanz 26.03.2012 / 23:15

6 respostas

2

bem se você estiver usando o plugin WyPiekacz; como você disse para verificar se a imagem em destaque foi carregada, você pode ajustar um pouco para verificar se, se houver uma imagem em destaque, é de um mínimo de dimesions conforme necessário.

$has_thumbnail = false;
            if ( ( $post_id > 0 ) && function_exists( 'has_post_thumbnail' ) ) {
                $has_thumbnail = has_post_thumbnail( $post_id );
            }

            $has_thumbnail = apply_filters( 'wypiekacz_check_thumbnail', $has_thumbnail, $post_id, $post_data );

            if ( !$has_thumbnail ) {
                $this->errors[] = array( 'post_thumbnail', __('Post thumbnail (Featured image) is required.', 'wypiekacz') );
            }

Você pode alterar o código acima em wypiekacz.php para,

$has_thumbnail_proper_dimension = false;
        if ( ( $post_id > 0 ) && function_exists( 'has_post_thumbnail' ) ) {
            $has_thumbnail = has_post_thumbnail( $post_id );
              list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full");
                echo $imgsrc[0];
              if($width>=640 and $height>=360){
                  $has_thumbnail_proper_dimension=true;
               }
        }

        $has_thumbnail = apply_filters( 'wypiekacz_check_thumbnail', $has_thumbnail, $post_id, $post_data );

        if ( !$has_thumbnail ) {
            $this->errors[] = array( 'post_thumbnail', __('Post thumbnail (Featured image) is required.', 'wypiekacz') );
        }
        if ( !$has_thumbnail_proper_dimension ) {
            $this->errors[] = array( 'post_thumbnail', __('Post thumbnail (Featured image) should be atleast 640x360.', 'wypiekacz') );
        }

Bem, eu não entendo o que você quer dizer com "Guia da Biblioteca de Mídia".

    
por Rajeev Vyas 12.04.2012 / 17:17
2

Eu verifiquei o núcleo e aparentemente há pouco espaço para manobras.

/wp-admin/includes/media.php é onde as guias Add Media são geradas

A função get_media_item na linha 1034 é aquela que renderiza a tabela attachments / media. Não consigo ver nenhum filtro nele ou as funções anteriores que chamam isso.

Algumas referências e exemplos de código em torno do problema.

Acho que uma solução alternativa seria alterar o título das imagens enviadas e anexar suas dimensões. Não tenho certeza sobre como alterar o post_title de um arquivo enviado, mas renomear o arquivo em si pode ser obtido com esses dois filtros: sanitize_file_name e wp_handle_upload_prefilter

    
por brasofilo 30.03.2012 / 21:18
1

Não é uma resposta completa e nem para a recompensa, apenas uma prova de que o conceito básico funciona:

function wpse_attachment_dimension_check( $form_fields, $post ) {

    $meta = wp_get_attachment_metadata($post->ID);

    if ( !empty[$meta['width']] )
        if ( $meta['width'] <= 999 or $meta['height'] <= 349 ) 
        {   
            echo '<p class="error">Image dimensions ...bla</p>';
            exit;
        }
        else
        {
             // Return all form fields
             return $form_fields;
        }
}

add_filter( 'attachment_fields_to_edit', 'wpse_attachment_dimension_check', 10, 2 );

Apenas um segundoSegmento de 60 segundos e tem um grande problema: isso será acionado a cada upload, e não apenas se alguém adicionar uma imagem em destaque, pois não temos como obter o contexto do carregador de imagens. Existem algumas maneiras de contornar isso, basicamente com alguma manipulação js.

Eu deveria estar trabalhando agora e não tenho tempo para experimentar. Mas eu queria ajudar o máximo que pudesse, e talvez este seja um ponto de partida para os outros.

felicidades

    
por ungestaltbar 12.04.2012 / 09:56
1

Esta não é a resposta mais elegante ... mas funciona! O plugin 'WyPiekacz', apesar de legal, não foi atualizado em três anos.

add_action('transition_post_status', 'check_featured_image_size_after_save', 10, 3);

function check_featured_image_size_after_save($new_status, $old_status, $post){
  $run_on_statuses = array('publish', 'pending', 'future');
  if(!in_array($new_status, $run_on_statuses))
    return;

  $post_id = $post->ID;
  if ( wp_is_post_revision( $post_id ) )
    return; //not sure about this.. but apparently save is called twice when this happens

  $image_data = wp_get_attachment_image_src( get_post_thumbnail_id( $post_id ), "Full" );
  if(!$image_data)
    return; //separate message if no image at all. (I use a plugin for this)

  $image_width = $image_data[1];
  $image_height = $image_data[2];

  // replace with your requirements.
  $min_width = 900;
  $min_height = 400;
  if($image_width < $min_width || $image_height < $min_height){
    // Being safe, honestly $old_status shouldn't be in $run_on_statuses... it wouldn't save the first time!
    $reverted_status = in_array($old_status, $run_on_statuses) ? 'draft' : $old_status;
    wp_update_post(array(
      'ID' => $post_id,
      'post_status' => $reverted_status,
    ));
    $back_link = admin_url("post.php?post=$post_id&action=edit");
    wp_die("Featured Image not large enough, must be at least ${min_width}x$min_height. Reverting status to '$reverted_status'.<br><br><a href='$back_link'>Go Back</a>");
  }
}

A solução mais elegante com a melhor experiência do usuário usaria o JavaScript para lidar com isso, tanto na edição rápida quanto na página de pós-edição. Então, para dar sorte, eu adicionaria algo ao filtro update_post_metadata (que funciona totalmente para impedir a imagem em destaque, mas não dará um aviso, já que é executado com o AJAX).

Os avisos de administração não serão exibidos porque o WordPress redireciona e, mesmo assim, não apareceria em uma Edição rápida (meu método mostra um aviso na Edição rápida, embora não esteja estilizado).

    
por Ryan Taylor 19.02.2015 / 21:31
0

Aqui está uma maneira de garantir que haja uma miniatura de tamanho adequado antes de exibi-la.

Primeiro, crie esta função auxiliar:

function has_post_thumbnail_of_size($width, $height) {
    $thumbnail_id = get_post_thumbnail_id();
    if( $thumbnail_id ) {
        $thumbnail_metadata = wp_get_attachment_metadata( $thumbnail_id );
        if( $thumbnail_metadata['height'] >= $height && $thumbnail_metadata['width'] >= $width ) {
            return true;
        }
    }
    return false;
}

Agora você pode verificar antes de exibir a miniatura da postagem:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}
    
por Sam Margulies 11.04.2012 / 21:07
0

Isso fará o que você precisa:)

//Adding script to deligate Thumbnail Size
if ( function_exists( 'add_theme_support' ) ) {
  add_theme_support( 'post-thumbnails' );
    set_post_thumbnail_size( 960, 276, true ); // default Post Thumbnail dimensions   
}
//Set different Thumbnail Sizes for Later
if ( function_exists( 'add_image_size' ) ) { 
  add_image_size( 'large-thumb', 960, 276, true ); //(cropped)  
  add_image_size( 'medium-thumb', 605, 174, true ); //(cropped) 
  add_image_size( 'small-thumb', 288, 83, true ); //(cropped) 
  add_image_size( 'small-square', 100, 100, true ); //(cropped) 
}

<?php if ( has_post_thumbnail() ) {
      global $post; //I usually define this in the function that outputs this, fyi
      echo '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( $post->post_title ) . '">';
      echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));
      echo '</a>'; 
      } else {

      $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));
      foreach ($thumbnails as $thumbnail) {
      echo '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( $post->post_title ) . '">';
      echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));
      echo '</a>';
      }           
    }   
    ?>

Ele está usando get_the_post_thumbnail, que também pode ajudá-lo, então você não precisa criar um monte de código fn que o WordPress já pode manipular para você, apenas um pensamento.

Isso usa $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id')); para pegar um aleatório, se um não estiver presente, isso pode ajudá-lo a avançar.

Esse bit echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) )); percebe que 'small-thumb' é correspondido a esses add_image_size fn que montamos algumas linhas. Então, se você tivesse add_image_size( 'small-square', 100, 100, true ); , poderia chamar 'small-square' alternativamente.

Felicidades

    
por David 12.04.2012 / 00:21