Requisiti di dimensioni minime per l'immagine in primo piano?


14

Sto creando un sito Web di baseball con più autori. Dall'esperienza passata, non importa quanto conosci qualcuno personalmente, non significa che seguiranno o addirittura leggeranno le tue istruzioni.

Detto questo, vorrei richiedere che qualsiasi immagine che un Autore decida di "Usa come immagine in primo piano" sia larga almeno 640 pixel e alta almeno 360 pixel.

Ho richiesto che ogni post abbia un'immagine in primo piano utilizzando il plug-in WyPiekacz ; il post non verrà pubblicato senza un'immagine in primo piano. Ho bloccato la possibilità per un autore di collegarsi a un altro sito rimuovendo la scheda "Da URL" in Aggiungi media utilizzando il codice di Bainternet.

Ora ho bisogno di richiedere che qualsiasi immagine utilizzata come immagine in primo piano sia almeno 640 pixel per 360 pixel. Non sono affatto un programmatore, ma ho giocato e cercato di usare il codice di Maor Barazany come punto di partenza, ma senza risultati. Il suo codice impone le dimensioni minime per qualsiasi immagine caricata .


Non riesco a rispondere alla tua domanda, ma devo dire grazie per una bella collezione di filtri e funzioni utili;)
Ole Henrik Skogstrøm

idem, Ole Henrik :)
brasofilo,

Che dire di immagini che sono attaccati ai post, ma non sono destinati ad essere utilizzati come il Post Foto di presentazione? E ' assolutamente impossibile che ogni post sarà sempre e solo hanno postali Foto di viaggio attaccato?
Chip Bennett,

No, ma ogni post deve avere un'immagine in primo piano. Questo è il motivo principale per cui il codice di Maor Barazany (link sopra) per forzare min. le dimensioni al caricamento non funzionerebbero (o il codice di ungestaltbar di seguito). Questi frammenti di codice impongono TUTTE le immagini caricate alle dimensioni minime. Gli utenti possono aggiungere ulteriori immagini ai loro post, ma "Immagine in primo piano" deve essere abbastanza grande da adattarsi al tema senza allungare. Questo è anche il motivo per cui desidero una colonna "Dimensioni immagine" nella scheda "Libreria multimediale" del programma di caricamento. Gli utenti saranno rapidamente in grado di scegliere un'immagine abbastanza grande per un'immagine in primo piano.
Travis Pflanz,

Ho capito che vuoi che tutti i post abbiano un'immagine in primo piano. Ma sarà sempre l' unica immagine allegata ai post? Oppure potrebbero avere messaggi altre immagini , oltre alla la Foto di presentazione?
Chip Bennett,

Risposte:


2

bene se stai usando il plugin WyPiekacz; come hai detto per verificare che l'immagine in primo piano sia caricata, puoi modificarla un po 'per verificare che se c'è un'immagine in primo piano abbia dimensioni minime come richiesto.

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

Puoi modificare il codice sopra in wypiekacz.php in,

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

bene non capisco cosa intendi per "Scheda Libreria multimediale".


Sei un uomo molto bello! Funziona perfettamente! La "Scheda Libreria multimediale" si trova nella schermata di caricamento dei media, come quando si fa clic su "Imposta immagine in primo piano" o "Carica / Inserisci" per i media. Ecco uno screenshot della mia idea - picasaweb.google.com/lh/photo/…
Travis Pflanz

Ho fatto un cambiamento. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');modificato in list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0];per controllare le dimensioni solo dell'immagine in primo piano e non di tutte le immagini allegate.
Travis Pflanz,

@TravisPflanz Questa è la funzione che genera la riga della "Scheda della libreria mediale" codex.wordpress.org/Function_Reference/get_media_item Non esiste un filtro qui, quindi non penso che tu possa cambiarlo senza collegarti al file wordpress .... Puoi accettare risposta / voto se utile ......
Rajeev Vyas

2

Ho controllato il nucleo e apparentemente c'è poco spazio per le manovre.

/wp-admin/includes/media.php è dove vengono generate le schede Aggiungi media

La funzione get_media_item nella riga 1034 è quella che esegue il rendering della tabella allegati / media. Non riesco a vedere alcun filtro disponibile in esso o le funzioni precedenti che lo chiamano.

Alcuni riferimenti e esempi di codice relativi al problema.

Immagino che una soluzione alternativa sarebbe quella di cambiare il titolo delle immagini caricate e aggiungerne le dimensioni. Non sono sicuro di modificare il post_title di un file caricato, ma è possibile ottenere la ridenominazione del file stesso con questi due filtri: sanitize_file_name e wp_handle_upload_prefilter


Quindi, quello che stai dicendo è che potrebbe essere possibile ... Forse? Non sono davvero un programmatore, quindi sono in balia degli altri quando si tratta di scrivere funzioni. Qualsiasi supporto sarebbe fantastico.
Travis Pflanz,

1

Non una risposta completa e non per la generosità, solo una prova del funzionamento del concetto di base:

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 uno snippet di 60 secondi e ha un grosso problema: si attiverà per ogni caricamento, e non solo se qualcuno è disposto ad aggiungere l'immagine in primo piano, perché non abbiamo un modo per ottenere il contesto del programma di caricamento dell'immagine. Ci sono alcuni modi per aggirare il problema, fondamentalmente con qualche manipolazione di js.

Dovrei lavorare in questo momento e non ho il tempo di sperimentarlo. Ma volevo aiutare il più possibile e forse questo è un punto di partenza per gli altri.

Saluti


Grazie per la risposta, il tuo codice fa essenzialmente quello che fa il codice di Maor Barazany (che è collegato alla domanda), sebbene il tuo sia molto meglio.
Travis Pflanz,

1

Questa non è la risposta più elegante ... ma funziona! Il plug-in 'WyPiekacz', sebbene interessante, non è stato aggiornato da tre anni.

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 soluzione più elegante con la migliore esperienza utente userebbe JavaScript per gestirla sia per la modifica rapida sia per la pagina di modifica post. Quindi per buona fortuna aggiungerei qualcosa aupdate_post_metadata filtro (che funziona totalmente per impedire l'immagine in primo piano ma non darà un avvertimento poiché viene eseguito con AJAX).

Gli avvisi di amministrazione non verranno visualizzati perché WordPress reindirizza e anche in questo caso non verrà visualizzato in una Modifica rapida (il mio metodo mostra un avviso in Modifica rapida anche se non è in stile).


Questo è stato testato? Non ho bisogno di farlo da un po 'di tempo, ma è bello aggiungere un segnalibro.
Travis Pflanz,

Forse lunedì posso eseguirlo sul nostro server di gestione temporanea, ma ho qualcosa del 99% simile a questo in esecuzione sulla produzione.
Ryan Taylor,

0

Ecco un modo per assicurarsi che ci sia una miniatura di dimensioni adeguate prima di visualizzarla.

Innanzitutto, crea questa funzione di supporto:

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

Quindi ora puoi controllare prima di visualizzare l'anteprima del post:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}

Devo impedire a un utente di allegare un'immagine troppo piccola, non di visualizzarla se è troppo piccola. Ogni post DEVE includere un'immagine. Ogni post mostrerà un'immagine.
Travis Pflanz,

Dovrei fare dei test ma c'è un modo per vedere come si potrebbe fare: ogni volta che un caricamento è andato a buon fine, WP recupererà i dati degli allegati tramite ajax per visualizzare successivamente il modulo dei dettagli degli allegati. Ciò significa che l'immagine è stata inserita come allegato e i metadati sono disponibili. IDEA: si potrebbe agganciare in attachments_fields_to_edit, che ottiene l'oggetto allegato come argomento, quindi controllare l'altezza e la larghezza dei metadati, se questo controllo fallisce non mostrare il modulo dettagli dell'allegato come al solito, mostrare invece un messaggio di errore ed eliminare immediatamente l'allegato . solo un'idea.
ungestaltbar l'

@ungestaltbar, sembra che tu abbia l'idea giusta. Non sono un programmatore, quindi sono in balia della comunità.
Travis Pflanz,

0

Questo farà ciò di cui hai bisogno :)

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

Sta usando get_the_post_thumbnail che può anche aiutarti, quindi non hai bisogno di creare un mucchio di codice fn che WordPress può già gestire per te, solo un pensiero.

Questo serve $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));per afferrarne uno casuale se uno non è presente, questo può aiutarti ad andare avanti.

Questo po 'si echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));nota 'small-thumb'che viene abbinato a quelle add_image_size che abbiamo messo insieme in poche righe. Quindi, se lo avessi, add_image_size( 'small-square', 100, 100, true );potresti chiamare in 'small-square'alternativa.

Saluti


Grazie per la risposta. Questo non fa ciò di cui ho bisogno, tuttavia. Il sito Web è un sito Web di baseball MLB, quindi una foto casuale di Albert Pujols non funzionerà per essere aggiunta a un articolo su Prince Fielder, se capisci cosa intendo ... Inoltre, come ho detto sopra, utilizzo il plug-in WyPiekacz per costringere gli utenti ad aggiungere un'immagine in primo piano. Quindi, il problema non è se aggiungono un'immagine, ma piuttosto che voglio forzarli ad aggiungere un'immagine che è più grande di 640 di larghezza e 360 ​​di altezza.
Travis Pflanz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.