¿Requisito de dimensiones mínimas para la imagen destacada?

13

Estoy creando un sitio web de béisbol con varios autores. De la experiencia pasada, no importa lo bien que conozcas personalmente a alguien, no significa que seguirán o incluso leerán tus instrucciones.

Dicho esto, me gustaría exigir que cualquier imagen que un Autor decida "Usar como imagen destacada" tenga un mínimo de 640 píxeles de ancho y un mínimo de 360 píxeles de alto.

He requerido que cada publicación tenga una Imagen destacada utilizando el complemento WyPiekacz ; La publicación no se publicará sin una imagen destacada. He bloqueado la capacidad de un Autor para un enlace directo a otro sitio mediante eliminando la pestaña "De URL" en Agregar medio utilizando el código de Bainternet.

Ahora debo exigir que cualquier imagen que se use como imagen destacada tenga al menos 640 píxeles por 360 píxeles. No soy un codificador, pero he estado jugando y tratando de usar el código de Maor Barazany como punto de partida, pero sin éxito. Su código obliga a dimensiones mínimas para cualquier imagen que se cargue .

    
pregunta Travis Pflanz 26.03.2012 - 23:15

6 respuestas

2

bien si está utilizando el complemento WyPiekacz; Como dijo para verificar que la imagen destacada se haya cargado, puede modificarla un poco para comprobar que si hay una imagen destacada es la cantidad mínima que necesita.

$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') );
            }

Puedes cambiar el código anterior en wypiekacz.php a,

$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') );
        }

bueno, no entiendo a qué te refieres con la "pestaña de la biblioteca de medios".

    
respondido por el Rajeev Vyas 12.04.2012 - 17:17
2

Revisé el núcleo y aparentemente hay poco espacio para maniobrar.

/wp-admin/includes/media.php es donde se generan las pestañas de Agregar Medios

La función get_media_item en la línea 1034 es la que representa la tabla de adjuntos / medios. No puedo ver ningún filtro disponible en él o las funciones anteriores que llaman a este.

Algunas referencias y ejemplos de código sobre el problema.

Supongo que una solución alternativa sería cambiar el título de las imágenes cargadas y añadir sus dimensiones. No estoy seguro de cambiar el post_título de un archivo cargado, pero cambiar el nombre del archivo se puede lograr con estos dos filtros: sanitize_file_name y wp_handle_upload_prefilter

    
respondido por el brasofilo 30.03.2012 - 21:18
1

No es una respuesta completa y no para la recompensa, solo una prueba de que el concepto 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 );

Solo un fragmento de 60segundos y tiene un gran problema: esto se activará para cada carga, y no solo si alguien está listo para agregar una imagen destacada, porque no tenemos una manera de obtener el contexto del cargador de imágenes. Hay algunas formas de solucionarlo, básicamente con alguna manipulación js.

Debería estar trabajando ahora mismo, y no tengo tiempo para experimentar con él. Pero quería ayudar tanto como pudiera, y quizás este sea un punto de partida para otros.

saludos

    
respondido por el ungestaltbar 12.04.2012 - 09:56
1

Esta no es la respuesta más elegante ... ¡pero funciona! El complemento 'WyPiekacz', aunque es genial, no se ha actualizado en tres años.

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>");
  }
}

La solución más elegante con la mejor experiencia de usuario usaría JavaScript para manejar esto tanto en Edición rápida como en la página de edición posterior. Luego, para buena suerte, agregaría algo al filtro update_post_metadata (que funciona totalmente para prevenir la imagen mostrada pero no da una advertencia ya que se ejecuta con AJAX).

Los avisos de administración no se mostrarán porque WordPress redirecciona, y aún así no aparecería en una edición rápida (mi método muestra una advertencia en la edición rápida aunque no tenga un estilo).

    
respondido por el Ryan Taylor 19.02.2015 - 21:31
0

Esta es una forma de asegurarse de que haya una miniatura del tamaño adecuado antes de mostrarla.

Primero, crea esta función 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;
}

Entonces ahora puedes verificar antes de mostrar la miniatura del post:

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

Esto hará lo que necesites :)

//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>';
      }           
    }   
    ?>

Está utilizando get_the_post_thumbnail que también puede ayudarte, por lo que no necesitas crear un montón de código fn que WordPress ya puede manejar por ti, solo un pensamiento.

Esto usa $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id')); para tomar uno al azar si uno no está presente, esto puede ayudarte a avanzar.

Este bit echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) )); nota el 'small-thumb' que se compara con los fn de add_image_size que juntamos unas pocas líneas. Así que si tuvieras add_image_size( 'small-square', 100, 100, true ); , podrías llamar a 'small-square' alternativamente.

Saludos

    
respondido por el David 12.04.2012 - 00:21

Lea otras preguntas en las etiquetas