web-dev-qa-db-fra.com

Exigences de dimensions minimales pour l'image sélectionnée?

Je crée un site Web de baseball avec plusieurs auteurs. Par le passé, si vous connaissez personnellement quelqu'un personnellement, cela ne signifie pas qu'il suivra ou même lira vos instructions.

Cela étant dit, j'aimerais que toute image qu'un auteur décide d'utiliser "Utiliser comme image sélectionnée" soit d'une largeur minimale de 640 pixels et d'une hauteur minimale de 360 ​​pixels.

J'ai demandé à chaque publication d'avoir une image sélectionnée à l'aide du plugin WyPiekacz ; le message ne sera pas publié sans une image en vedette. J'ai bloqué la possibilité pour un auteur de créer un lien direct avec un autre site en en supprimant l'onglet "De l'URL" dans Ajouter un média en utilisant le code de Bainternet.

Maintenant, j'ai besoin d'exiger que toute image utilisée en tant qu'image sélectionnée soit d'au moins 640 pixels par 360 pixels. Je ne suis pas un moyen de coder, mais j'ai joué avec et essayé d'utiliser le code de Maor Barazany comme point de départ, mais en vain. Son code force dimensions minimales pour toute image téléchargée .

14
Travis Pflanz

bien si vous utilisez le plugin WyPiekacz; comme vous l'avez dit pour vérifier que l'image sélectionnée est téléchargée, vous pouvez la modifier un petit peu pour vérifier que s'il existe une image sélectionnée, le nombre de dimesions minimal requis est atteint.

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

Vous pouvez changer le code ci-dessus dans wypiekacz.php en,

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

eh bien, je ne comprends pas ce que vous entendez par "onglet".

2
Rajeev Vyas

J'ai vérifié le noyau et apparemment, il y a peu de marge de manœuvre.

/wp-admin/includes/media.php est l'endroit où les onglets Ajouter un média sont générés

La fonction get_media_item à la ligne 1034 est celle qui affiche la table des pièces jointes/média. Je ne vois aucun filtre disponible ni les fonctions précédentes qui appellent celui-ci.

Quelques références et exemples de code autour du problème.

J'imagine qu'une solution alternative consisterait à changer le titre des images téléchargées et à en ajouter les dimensions. Je ne suis pas sûr de changer le post_title d'un fichier téléchargé, mais il est possible de renommer le fichier lui-même avec ces deux filtres: sanitize_file_name et wp_handle_upload_prefilter

2
brasofilo

Ce n'est pas la réponse la plus élégante ... mais ça marche! Le plugin 'WyPiekacz', bien que cool, n'a pas été mis à jour depuis trois ans.

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 solution la plus élégante avec la meilleure expérience utilisateur utiliserait JavaScript pour gérer cela à la fois pour l'édition rapide et la page de post-édition. Alors pour la bonne chance j'ajouterais quelque chose au filtre update_post_metadata (qui fonctionne totalement pour empêcher l'image sélectionnée mais ne donne pas d'avertissement puisqu'il est exécuté avec AJAX).

Les notifications de l'administrateur n'apparaîtront pas à cause des redirections WordPress, et même dans ce cas, elles ne s'afficheraient pas dans une édition rapide (ma méthode affiche un avertissement dans Édition rapide bien qu'elle ne soit pas stylisée).

1
Ryan Taylor

Pas une réponse complète et pas pour la prime, mais simplement une preuve que le concept de base fonctionne:

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

Seulement un 60secondsSnippet et a un gros problème: cela se déclenchera pour chaque téléchargement, et pas seulement si quelqu'un est prêt à ajouter une image sélectionnée, car nous n'avons pas un moyen d'obtenir le contexte de l'uploader d'image. Il existe quelques moyens de contourner le problème, essentiellement avec une manipulation de js.

Je devrais travailler maintenant et je n’ai pas le temps d’expérimenter. Mais je voulais aider autant que je pouvais, et c'est peut-être un point de départ pour les autres.

à votre santé

1
ungestaltbar

Voici un moyen de vous assurer qu’une vignette correctement dimensionnée est bien affichée avant de l’afficher.

Tout d'abord, créez cette fonction d'assistance:

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

Ensuite, vous pouvez maintenant vérifier avant d’afficher la vignette du message:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}
0
Sam Margulies

Cela fera ce qu'il faut :)

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

Il utilise get_the_post_thumbnail qui peut également vous aider à ne pas créer un tas de code fn que WordPress peut déjà gérer pour vous, rien qu’une pensée.

Ceci utilise $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'Rand','meta_key' => '_thumbnail_id')); pour en prendre un au hasard s'il n'y en a pas, cela peut vous aider à avancer.

Ce bit echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) )); remarque le 'small-thumb' auquel il correspond, avec ces fn de add_image_size que nous avons rassemblés sur quelques lignes. Donc, si vous aviez add_image_size( 'small-square', 100, 100, true );, vous pouvez également appeler 'small-square'.

À votre santé

0
David