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

14

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

Dito isto, eu gostaria de exigir que qualquer imagem que um autor decida "Usar como imagem em destaque" tenha no mínimo 640px de largura e um mínimo de 360px de altura.

Eu exigi que cada postagem tivesse uma Imagem em destaque usando o plugin WyPiekacz ; a postagem não será publicada sem uma imagem em destaque. Eu bloqueei a capacidade de um Autor fazer o hotlink para outro site removendo a guia "Do URL" em Adicionar mídia usando o código da Bainternet.

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

Travis Pflanz
fonte
Não pode responder à sua pergunta, mas eu tenho que dizer obrigado por uma bela coleção de filtros e funções úteis;)
Ole Henrik Skogstrøm
idem, Ole Henrik :)
brasofilo 30/03
E sobre as imagens que estão ligados a mensagens, mas não estão destinados a ser utilizado como o Post Imagem em destaque? É absolutamente impossível que todas as postagens tenham apenas imagens em destaque da postagem?
Chip Bennett
Não, mas todas as postagens precisam ter uma imagem em destaque. Esta é a principal razão pela qual o código de Maor Barazany (link acima) para forçar min. as dimensões no upload não funcionariam (ou no código da ungestaltbar abaixo). Esses trechos de código forçam TODAS as imagens enviadas às dimensões mínimas. Os usuários podem adicionar imagens adicionais às suas postagens, mas a "Imagem em destaque" deve ser grande o suficiente para caber no tema sem esticar. É também por isso que desejo uma coluna "Dimensões da imagem" na guia "Biblioteca de mídia" do remetente. Os usuários poderão escolher rapidamente uma imagem grande o suficiente para uma imagem em destaque.
Travis Pflanz
Eu obter que deseja todos os posts de ter uma imagem em destaque. Mas essa sempre será a única imagem anexada às postagens? Ou poderia mensagens têm outras imagens em adição para a Imagem em destaque?
Chip Bennett

Respostas:

2

bem, se você estiver usando o plugin WyPiekacz; como você disse para verificar se a imagem em destaque foi carregada, você pode ajustá-la um pouco para verificar se a imagem em destaque possui dimensões mínimas, 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 Biblioteca de mídia".

Rajeev Vyas
fonte
Você é um homem bonito! Funciona perfeitamente! A "Guia Biblioteca de mídia" está na tela de upload de mídia, como quando você clica em "Definir imagem em destaque" ou "Upload / Inserir" para mídia. Aqui está uma captura de tela da minha ideia - picasaweb.google.com/lh/photo/…
Travis Pflanz
Eu fiz uma alteração. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');alterado para list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0];para verificar as dimensões apenas da imagem em destaque e nem todas as imagens anexadas.
Travis Pflanz
@TravisPflanz Esta é a função que gera a linha de "Medial Biblioteca Tab" codex.wordpress.org/Function_Reference/get_media_item Não há filtro aqui, então eu não acho que você pode mudá-lo wihtout enganchando em arquivo wordpress .... Você pode aceitar resposta / upvote se útil ......
Rajeev Vyas
2

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

/wp-admin/includes/media.php é onde as guias Adicionar Mídia são geradas

A função get_media_item na linha 1034 é a que renderiza a tabela de anexos / mídia. Não vejo nenhum filtro disponível nele ou as funções anteriores que chamam este.

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 título post 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

brasofilo
fonte
Então, o que você está dizendo é que isso pode ser possível ... Talvez? Eu realmente não sou um programador, então estou à mercê dos outros quando se trata de escrever funções. Qualquer apoio seria ótimo.
Travis Pflanz
1

Não é uma resposta completa e não é uma 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 60segsSnippet e tem um grande problema: Isso será acionado para cada upload, e não apenas se alguém quiser adicionar uma imagem em destaque, porque não temos como entender o contexto do upload de imagens. Existem algumas maneiras de contornar isso, basicamente com alguma manipulação de js.

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

Felicidades

ungestaltbar
fonte
Obrigado pela resposta, seu código faz essencialmente o que o código de Maor Barazany faz (que está vinculado na pergunta), embora o seu seja muito melhor.
Travis Pflanz
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 JavaScript para lidar com isso na Edição rápida e na página de pós-edição. Então, para dar sorte, eu adicionaria algo ao update_post_metadatafiltro (que funciona totalmente para impedir a imagem em destaque, mas não emitirá um aviso, pois é executado com o AJAX).

Os avisos do administrador não aparecerão porque o WordPress redireciona e, mesmo assim, não apareceriam em uma Edição Rápida (meu método mostra um aviso na Edição Rápida, embora não tenha estilo).

Ryan Taylor
fonte
Isso foi testado? Eu não preciso fazer isso há um tempo, mas é bom marcar como favorito.
Travis Pflanz
Talvez na segunda-feira eu possa executá-lo em nosso servidor de temporariedade, mas tenho algo 99% semelhante a isso em execução na produção.
Ryan Taylor
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();
}
Sam Margulies
fonte
Preciso restringir um usuário de anexar uma imagem muito pequena, não impedir que ela seja exibida se ela for muito pequena. Cada post DEVE incluir uma imagem. Cada postagem exibirá uma imagem.
Travis Pflanz
Teria que fazer testes, mas há uma maneira de ver como isso pode ser feito: sempre que um upload foi bem-sucedido, o WP buscará os dados do anexo via ajax para exibir o formulário de detalhes do anexo posteriormente. Isso significa que a imagem foi inserida como anexo e os metadados estão disponíveis. IDÉIA: É possível conectar-se a attachments_fields_to_edit, que obtém o objeto de anexo como argumento e, em seguida, verificar a altura e a largura dos metadados. Se essa verificação falhar, não mostre o formulário de detalhes do anexo como de costume, mostre uma mensagem de erro e exclua o anexo instantaneamente . apenas uma ideia.
ungestaltbar
@ungestaltbar, parece que você tem a ideia certa. Eu não sou programador, então estou à mercê da comunidade.
Travis Pflanz
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, para que você não precise 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 não houver um presente, isso pode ajudá-lo a seguir em frente.

Este pequeno echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));aviso 'small-thumb'mostra que ele corresponde àqueles add_image_size fn's que reunimos algumas linhas. Então, se você tivesse, add_image_size( 'small-square', 100, 100, true );poderia ligar 'small-square'alternativamente.

Felicidades

David
fonte
Obrigado pela resposta. Isso não faz o que eu preciso, no entanto. O site é um site de beisebol da MLB, portanto, uma imagem aleatória de Albert Pujols não funcionará para ser adicionada a um artigo sobre Prince Fielder, se você entende o que quero dizer ... Além disso, como mencionei acima, eu uso o plugin WyPiekacz para forçar os usuários a adicionar uma imagem em destaque. Portanto, o problema não é se eles adicionam uma imagem, mas em vez disso, quero forçá-los a adicionar uma imagem com mais de 640 de largura e 360 ​​de altura.
Travis Pflanz #