¿Dimensiones mínimas requeridas para la imagen destacada?

14

Estoy creando un sitio web de béisbol con múltiples autores. Por experiencia pasada, no importa qué tan bien conozca a alguien personalmente, no significa que siga o incluso lea sus instrucciones.

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

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

Ahora necesito exigir que cualquier imagen utilizada como imagen destacada sea de al menos 640 px por 360 px. No soy un codificador, pero he estado jugando e intentando usar el código de Maor Barazany como punto de partida, pero fue en vano. Su código fuerza dimensiones mínimas para cualquier imagen que se carga .

Travis Pflanz
fuente
No puedo responder a su pregunta, pero tengo que decir gracias por una buena colección de prácticos filtros y funciones;)
Ole Henrik Skogstrøm
lo mismo, Ole Henrik :)
brasofilo
¿Qué pasa con las imágenes que se adjuntan a las publicaciones, pero que no están destinadas a ser utilizadas como la Imagen destacada de la publicación? ¿Es absolutamente imposible que cada publicación solo tenga adjuntas imágenes destacadas?
Chip Bennett
No, pero se requiere que cada publicación tenga una imagen destacada. Esta es la razón principal por la cual el código de Maor Barazany (enlace de arriba) obliga a min. las dimensiones en la carga no funcionarían (o el código de ungestaltbar a continuación). Esos fragmentos de código fuerzan TODAS las imágenes cargadas a las dimensiones mínimas. Los usuarios pueden agregar imágenes adicionales a sus publicaciones, pero la "Imagen destacada" debe ser lo suficientemente grande como para ajustarse al tema sin estirarse. Esta es también la razón por la que quiero una columna "Dimensiones de imagen" en la pestaña "Biblioteca de medios" del cargador. Los usuarios podrán elegir rápidamente una imagen lo suficientemente grande para una imagen destacada.
Travis Pflanz
Yo entiendo que desea que todos los mensajes que tienen una imagen destacada. ¿Pero será siempre la única imagen adjunta a las publicaciones? ¿O podrían las publicaciones tener otras imágenes además de la Imagen destacada?
Chip Bennett

Respuestas:

2

bueno si estás usando el complemento WyPiekacz; como dijiste para comprobar que la imagen destacada está cargada, puedes modificarla un poco para comprobar que si hay una imagen destacada es de dimensiones mínimas según lo requerido.

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

Puede 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 lo que quieres decir con "pestaña Biblioteca de medios".

Rajeev Vyas
fuente
¡Eres un hombre hermoso! ¡Funciona perfectamente! La "Pestaña Biblioteca de medios" se encuentra en la pantalla de carga de medios, como cuando hace clic en "Establecer imagen destacada" o "Cargar / Insertar" para medios. Aquí hay una captura de pantalla de mi idea: picasaweb.google.com/lh/photo/…
Travis Pflanz
Hice un cambio. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');cambiado a list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0];para verificar las dimensiones de solo la Imagen destacada y no todas las imágenes adjuntas.
Travis Pflanz
@TravisPflanz Esta es la función que da salida a la fila de "medial Biblioteca Tab" codex.wordpress.org/Function_Reference/get_media_item No hay filtro de aquí, así que no creo que se pueda cambiarlo wihtout enganchar en el archivo wordpress .... Usted puede aceptar responder / votar si es útil ......
Rajeev Vyas
2

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

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

La función get_media_item en la línea 1034 es la que representa los archivos adjuntos / tabla de 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 tema.

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

brasofilo
fuente
Entonces, lo que estás diciendo es que podría ser posible ... ¿Tal vez? Realmente no soy codificador, por lo que estoy a merced de los demás cuando se trata de escribir funciones. Cualquier apoyo sería genial.
Travis Pflanz
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 snippet de 60 segundos y tiene un gran problema: esto se disparará por cada carga, y no solo si alguien está dispuesto a agregar una imagen destacada, porque no tenemos una forma de obtener el contexto del cargador de imágenes. Hay algunas formas de solucionarlo, básicamente con alguna manipulación de js.

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

salud

ungestaltbar
fuente
Gracias por la respuesta, su código hace esencialmente lo que hace el código de Maor Barazany (que está vinculado en la pregunta), aunque el suyo es mucho mejor.
Travis Pflanz
1

Esta no es la respuesta más elegante ... ¡pero funciona! El complemento 'WyPiekacz', aunque interesante, 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 para la Edición rápida como para la página de edición posterior. Luego, para la buena suerte, agregaría algo al update_post_metadatafiltro (que funciona totalmente para prevenir la imagen presentada pero no dará una advertencia ya que se ejecuta con AJAX).

Los avisos de administrador no se mostrarán porque WordPress redirige, e incluso entonces no aparecerían en una Edición rápida (mi método muestra una advertencia en Edición rápida aunque no tiene estilo).

Ryan Taylor
fuente
¿Esto ha sido probado? No he necesitado hacer esto en mucho tiempo, pero es bueno marcarlo.
Travis Pflanz
Tal vez el lunes pueda ejecutarlo en nuestro servidor provisional, pero tengo algo 99% similar a esto ejecutándose en producción.
Ryan Taylor
0

Aquí hay una forma de asegurarse de que haya una miniatura del tamaño adecuado antes de mostrarla.

Primero, cree 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 puede verificar antes de mostrar la miniatura de la publicación:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}
Sam Margulies
fuente
Necesito restringir que un usuario adjunte una imagen que es demasiado pequeña, no restringir que se muestre si es demasiado pequeña. Cada publicación DEBE incluir una imagen. Cada publicación mostrará una imagen.
Travis Pflanz
Tendría que hacer pruebas, pero hay una forma en que veo cómo se puede hacer esto: cada vez que una carga se realizó correctamente, WP buscará los datos del archivo adjunto a través de ajax para mostrar el formulario de detalles del archivo adjunto después. Esto significa que la imagen se ha insertado como un archivo adjunto y los metadatos están disponibles. IDEA: Uno podría engancharse en archivos adjuntos_campos_de_edición, que obtiene el objeto adjunto como argumento, luego verifique la altura y el ancho de los metadatos, si esta verificación falla, no muestre el formulario de detalles del archivo adjunto como de costumbre, muestre un mensaje de error y elimine el archivo adjunto instantáneamente . solo una idea.
ungestaltbar
@ungestaltbar, parece que tienes la idea correcta. No soy codificador, así que estoy a merced de la comunidad.
Travis Pflanz
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á usando get_the_post_thumbnail que también puede ayudarlo, por lo que no necesitó crear un montón de código fn que WordPress ya puede manejar por usted, solo un pensamiento.

Esto se usa $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));para tomar uno aleatorio si no hay uno presente, esto puede ayudarlo a avanzar.

Este bit se da echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));cuenta de 'small-thumb'que coincide con los add_image_size fn's que reunimos en algunas líneas. Entonces, si tuviera add_image_size( 'small-square', 100, 100, true );, podría llamar 'small-square'alternativamente.

Salud

David
fuente
Gracias por la respuesta. Sin embargo, esto no hace lo que necesito. El sitio web es un sitio web de béisbol de la MLB, por lo que una imagen aleatoria de Albert Pujols no funcionará para agregarse a un artículo sobre Prince Fielder, si entiendes lo que quiero decir ... Además, como mencioné anteriormente, uso el complemento WyPiekacz para obligar a los usuarios a agregar una imagen destacada. Entonces, el problema no es si agregan una imagen, sino que quiero forzarlos a agregar una imagen que sea mayor que 640 de ancho y 360 de alto.
Travis Pflanz