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

14

Je crée un site Web de baseball avec plusieurs auteurs. D'après l'expérience passée, peu importe si vous connaissez bien quelqu'un personnellement, cela ne signifie pas qu'il suivra ou même lira vos instructions.

Cela étant dit, je voudrais exiger que toute image qu'un auteur décide d '"utiliser comme image sélectionnée" ait une largeur minimale de 640 pixels et une hauteur minimale de 360 ​​pixels.

J'ai exigé que chaque publication ait une image sélectionnée à l'aide du plugin WyPiekacz ; la publication ne sera pas publiée sans image sélectionnée. J'ai bloqué la possibilité pour un auteur de créer un lien hypertexte vers un autre site en supprimant l'onglet "De l'URL" dans Ajouter un média à l' aide du code de Bainternet.

Maintenant, je dois exiger que toute image utilisée comme image sélectionnée soit d'au moins 640 pixels sur 360 pixels. Je ne suis pas un codeur, mais j'ai joué avec et essayé d'utiliser le code de Maor Barazany comme point de départ, mais en vain. Son code impose des dimensions minimales pour toute image téléchargée .

Travis Pflanz
la source
Je ne peux pas répondre à votre question, mais je dois vous dire merci pour une belle collection de filtres et de fonctions pratiques;)
Ole Henrik Skogstrøm
idem, Ole Henrik :)
brasofilo
Qu'en est-il des images jointes aux articles, mais qui ne sont pas destinées à être utilisées comme image vedette du message? Est-il absolument impossible que chaque article ne contienne que des images en vedette?
Chip Bennett
Non, mais chaque publication doit avoir une image en vedette. C'est la raison principale pour laquelle le code de Maor Barazany (lien ci-dessus) force min. les dimensions lors du téléchargement ne fonctionneraient pas (ou le code d'ungestaltbar ci-dessous). Ces extraits de code forcent TOUTES les images téléchargées aux dimensions minimales. Les utilisateurs peuvent ajouter des images supplémentaires à leurs messages, mais l '"image sélectionnée" doit être suffisamment grande pour s'adapter au thème sans s'étirer. C'est aussi pourquoi je veux une colonne "Dimensions de l'image" sur l'onglet "Médiathèque" de l'uploader. Les utilisateurs pourront rapidement choisir une image suffisamment grande pour une image sélectionnée.
Travis Pflanz
Je comprends que vous souhaitez que tous les messages aient une image sélectionnée. Mais sera-ce toujours la seule image attachée aux messages? Ou les messages pourraient-ils avoir d' autres images en plus de l'image sélectionnée?
Chip Bennett

Réponses:

2

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 l'ajuster un peu pour vérifier que s'il y a une image sélectionnée, elle est de dimensions minimales selon vos besoins.

$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 Bibliothèque multimédia".

Rajeev Vyas
la source
Vous êtes un bel homme! Marche parfaitement! L'onglet «Médiathèque» se trouve dans l'écran de téléchargement des médias, comme lorsque vous cliquez sur «Définir l'image sélectionnée» ou «Télécharger / insérer» pour les médias. Voici une capture d'écran de mon idée - picasaweb.google.com/lh/photo/…
Travis Pflanz
J'ai fait un changement. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');modifié pour list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0];vérifier uniquement les dimensions de l'image sélectionnée et pas toutes les images jointes.
Travis Pflanz
@TravisPflanz Il s'agit de la fonction qui génère la ligne de "Medial Library Tab" codex.wordpress.org/Function_Reference/get_media_item Il n'y a pas de filtre ici, donc je ne pense pas que vous pouvez le changer sans le raccorder au fichier wordpress .... Vous pouvez accepter réponse / vote positif si utile ......
Rajeev Vyas
2

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 de la ligne 1034 est celle qui rend 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.

Je suppose qu'une solution alternative serait de changer le titre des images téléchargées et d'ajouter ses dimensions. Je ne change pas sûr de la post_title d'un fichier téléchargé, mais renommer le fichier lui - même peut être réalisé avec ces deux filtres: sanitize_file_name et wp_handle_upload_prefilter

brasofilo
la source
Donc, ce que vous dites, c'est que cela pourrait être possible ... Peut-être? Je ne suis vraiment pas un codeur, donc je suis à la merci des autres quand il s'agit de fonctions d'écriture. Tout soutien serait formidable.
Travis Pflanz
1

Pas une réponse complète et pas pour la prime, juste 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 );

Juste un Snippet de 60 secondes 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 de moyen d'obtenir le contexte du téléchargeur d'image. Il existe plusieurs façons de contourner ce problème, essentiellement avec une manipulation js.

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

à votre santé

ungestaltbar
la source
Merci pour la réponse, votre code fait essentiellement ce que fait le code de Maor Barazany (qui est lié dans la question), bien que le vôtre soit bien meilleur.
Travis Pflanz
1

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 auupdate_post_metadata filtre (qui fonctionne totalement pour empêcher l'image en vedette mais ne donnera pas d'avertissement car il est exécuté avec AJAX).

Les notifications d'administrateur n'apparaîtront pas parce que WordPress redirige, et même alors, n'apparaîtra pas sur une édition rapide (ma méthode affiche un avertissement sur l'édition rapide bien qu'il ne soit pas stylisé).

Ryan Taylor
la source
Cela a-t-il été testé? Je n'ai pas eu besoin de faire ça depuis un moment, mais c'est agréable de mettre un signet.
Travis Pflanz
Lundi, je peux peut-être l'exécuter sur notre serveur de transfert, mais j'ai quelque chose de similaire à 99% à cette exécution en production.
Ryan Taylor
0

Voici une façon de vous assurer qu'il existe une miniature correctement dimensionnée avant de l'afficher.

Créez d'abord 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 miniature du message:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}
Sam Margulies
la source
J'ai besoin d'empêcher un utilisateur de joindre une image trop petite, de ne pas l'empêcher de s'afficher si elle est trop petite. Chaque message DOIT inclure une image. Chaque message affichera une image.
Travis Pflanz
Il faudrait faire des tests, mais il y a un moyen de voir comment cela pourrait être fait: chaque fois qu'un téléchargement a réussi, WP récupère les données de la pièce jointe via ajax pour afficher le formulaire de détails de la pièce jointe par la suite. Cela signifie que l'image a été insérée en tant que pièce jointe et que les métadonnées sont disponibles. IDÉE: On pourrait se connecter à attachments_fields_to_edit, qui obtient l'objet attachement comme argument, puis vérifier la hauteur et la largeur des métadonnées, si cette vérification échoue, n'affichez pas le formulaire de détails de la pièce jointe comme d'habitude, affichez un message d'erreur à la place et supprimez la pièce jointe instantanément . juste une idée.
ungestaltbar
@ungestaltbar, on dirait que vous avez la bonne idée. Je ne suis pas codeur, je suis donc à la merci de la communauté.
Travis Pflanz
0

Cela fera ce dont vous avez besoin :)

//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, vous n'avez donc pas besoin de créer un tas de code fn que WordPress peut déjà gérer pour vous, juste une pensée.

Cela permet $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));d'en saisir 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 'small-thumb'qu'il est mis en correspondance avec ces fn add_image_size que nous avons rassemblés en quelques lignes. Donc, si vous en aviez, add_image_size( 'small-square', 100, 100, true );vous pourriez faire appel 'small-square'alternativement.

À votre santé

David
la source
Merci pour la réponse. Cependant, cela ne fait pas ce dont j'ai besoin. Le site Web est un site Web de baseball MLB, donc une image aléatoire d'Albert Pujols ne fonctionnera pas pour être ajoutée à un article sur Prince Fielder, si vous comprenez ce que je veux dire ... Aussi, comme je l'ai mentionné ci-dessus, j'utilise le plugin WyPiekacz pour forcer les utilisateurs à ajouter une image sélectionnée. Donc, le problème n'est pas de savoir s'ils ajoutent une image, mais plutôt de les forcer à ajouter une image plus grande que 640 de large et 360 de haut.
Travis Pflanz