Mindestabmessungen für empfohlenes Bild erforderlich?

14

Ich erstelle eine Baseball-Website mit mehreren Autoren. Aus der Vergangenheit, egal wie gut Sie jemanden persönlich kennen, bedeutet dies nicht, dass er Ihren Anweisungen folgt oder sie sogar liest.

Davon abgesehen möchte ich verlangen, dass jedes Bild, das ein Autor als "Verwendetes Bild" auswählt, mindestens 640 Pixel breit und mindestens 360 Pixel groß ist.

Ich habe verlangt, dass jeder Beitrag ein Featured Image mit dem WyPiekacz-Plugin enthält . Der Beitrag wird nicht ohne ein ausgewähltes Bild veröffentlicht. Ich habe die Möglichkeit für einen Autor, einen Hotlink zu einer anderen Site zu erstellen, blockiert, indem die Registerkarte "Von URL" unter "Medien hinzufügen" mit Bainternets Code entfernt wurde.

Jetzt muss ich verlangen, dass jedes Bild, das als vorgestellten Bild verwendet wird, mindestens 640 x 360 Pixel groß ist. Ich bin auf keinen Fall ein Programmierer, aber ich habe mit dem Code von Maor Barazany herumgespielt und versucht, ihn als Ausgangspunkt zu verwenden, aber ohne Erfolg. Sein Code erzwingt Mindestabmessungen für jedes hochgeladene Bild .

Travis Pflanz
quelle
Ich kann Ihre Frage nicht beantworten, aber ich muss mich für eine schöne Sammlung von nützlichen Filtern und Funktionen bedanken;)
Ole Henrik Skogstrøm
ditto, Ole Henrik :)
Brasofilo
Was über Bilder , die an Pfosten befestigt sind, sind aber nicht gedacht als Beitrag Ausgewähltes Bild verwendet werden? Ist es absolut unmöglich, dass an jedem Post immer nur Post Featured Images angehängt werden?
Chip Bennett
Nein, aber für jeden Beitrag ist ein Bild erforderlich. Dies ist der Hauptgrund, warum Maor Barazanys Code (Link oben) min erzwingt. Abmessungen beim Hochladen würden nicht funktionieren (oder ungestaltbars Code unten). Diese Code-Schnipsel erzwingen, dass ALLE hochgeladenen Bilder die Mindestgröße haben. Benutzer können ihren Posts zusätzliche Bilder hinzufügen, aber das "Featured Image" muss groß genug sein, um zum Thema zu passen, ohne es zu dehnen. Aus diesem Grund möchte ich auch eine Spalte "Bildabmessungen" auf der Registerkarte "Medienbibliothek" des Uploaders. Benutzer können schnell ein Bild auswählen, das groß genug für ein bestimmtes Bild ist.
Travis Pflanz
Ich verstehe, dass Sie möchten , dass alle Beiträge ein Featured Image haben. Aber wird das immer das einzige Bild sein, das an Beiträge angehängt wird? Oder könnten Beiträge haben andere Bilder in Zusätzlich zu dem Ausgewähltes Bild?
Chip Bennett

Antworten:

2

gut, wenn Sie das WyPiekacz-Plugin verwenden; Wie Sie sagten, um zu überprüfen, ob das ausgewählte Bild hochgeladen wurde, können Sie es ein wenig optimieren, um zu überprüfen, ob das ausgewählte Bild die erforderlichen Mindestmaße aufweist.

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

Sie können den obigen Code in wypiekacz.php ändern,

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

Nun, ich verstehe nicht, was Sie mit "Media Library Tab" meinen.

Rajeev Vyas
quelle
Du bist ein hübscher Mann! Funktioniert perfekt! Die Registerkarte "Medienbibliothek" befindet sich im Bildschirm zum Hochladen von Medien, z. B. wenn Sie für Medien auf "Ausgewähltes Bild festlegen" oder "Hochladen / Einfügen" klicken. Hier ist ein Screenshot meiner Idee - picasaweb.google.com/lh/photo/…
Travis Pflanz
Ich habe eine Änderung vorgenommen. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');geändert, list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0];um nur die Abmessungen des ausgewählten Bildes und nicht aller angehängten Bilder zu überprüfen.
Travis Pflanz
@TravisPflanz Dies ist die Funktion, die die Reihe der „Medial Bibliothek Tab“ gibt codex.wordpress.org/Function_Reference/get_media_item Es gibt keine Filter hier ist so nicht , daß ich glaube , Sie es wihtout Einhaken in Wordpress - Datei ändern können .... Sie akzeptieren können Antwort / Positive Bewertung falls nützlich ......
Rajeev Vyas
2

Ich habe den Kern überprüft und anscheinend gibt es wenig Spielraum.

In /wp-admin/includes/media.php werden Registerkarten zum Hinzufügen von Medien generiert

Die Funktion get_media_item in Zeile 1034 gibt die Tabelle attachments / media wieder. Ich kann keinen darin verfügbaren Filter oder die vorherigen Funktionen, die diesen aufrufen, sehen.

Einige Verweise und Codebeispiele rund um das Problem.

Ich denke, eine alternative Lösung wäre, den Titel der hochgeladenen Bilder zu ändern und seine Abmessungen anzufügen. Ich bin nicht sicher über die POST_TITLE einer hochgeladenen Datei zu ändern, aber das Umbenennen der Datei selbst mit diesen beiden Filter erreicht werden kann: sanitize_file_name und wp_handle_upload_prefilter

Brasofilo
quelle
Also, was du sagst ist, dass es möglich sein könnte ... Vielleicht? Ich bin wirklich kein Programmierer, also bin ich anderen ausgeliefert, wenn es um das Schreiben von Funktionen geht. Jede Unterstützung wäre toll.
Travis Pflanz
1

Keine vollständige Antwort und nicht für das Kopfgeld, nur ein Beweis dafür, dass das Grundkonzept funktioniert:

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

Nur ein 60secondsSnippet und hat ein großes Problem: Dies wird bei jedem Upload ausgelöst, und nicht nur, wenn jemand bereit ist, ein ausgewähltes Bild hinzuzufügen, da wir keine Möglichkeit haben, den Kontext des Bild-Uploaders zu ermitteln. Es gibt einige Möglichkeiten, dies zu umgehen, im Grunde genommen mit ein paar Manipulationen.

Ich sollte jetzt arbeiten und habe keine Zeit, damit zu experimentieren. Aber ich wollte so viel wie möglich helfen, und vielleicht ist dies ein Ausgangspunkt für andere.

Prost

ungestaltbar
quelle
Vielen Dank für die Antwort, Ihr Code entspricht im Wesentlichen dem Code von Maor Barazany (der in der Frage verlinkt ist), obwohl Ihr Code viel besser ist.
Travis Pflanz
1

Dies ist nicht die eleganteste Antwort ... aber es funktioniert! Das 'WyPiekacz'-Plugin ist zwar cool, wurde aber seit drei Jahren nicht mehr aktualisiert.

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

Die eleganteste Lösung mit der besten Benutzererfahrung würde JavaScript verwenden, um dies sowohl für die Schnellbearbeitung als auch für die Nachbearbeitungsseite zu handhaben. Dann füge ich zum Glück etwas zum update_post_metadataFilter hinzu (das zwar das Auftauchen des Bildes verhindert, aber keine Warnung ausgibt, da es mit AJAX ausgeführt wird).

Administratorbenachrichtigungen werden nicht angezeigt, da WordPress umleitet und auch dann nicht bei einer Schnellbearbeitung angezeigt wird (meine Methode zeigt eine Warnung bei der Schnellbearbeitung an, obwohl sie nicht gestaltet ist).

Ryan Taylor
quelle
Wurde dies getestet? Ich brauchte das schon eine Weile nicht mehr zu tun, aber es ist schön, Lesezeichen zu setzen.
Travis Pflanz
Vielleicht kann ich es am Montag auf unserem Staging-Server ausführen, aber ich habe etwas 99% Ähnliches wie dieses, das in der Produktion ausgeführt wird.
Ryan Taylor
0

Hier ist eine Möglichkeit, um sicherzustellen, dass ein Miniaturbild in der richtigen Größe vorhanden ist, bevor es angezeigt wird.

Erstellen Sie zunächst diese Hilfsfunktion:

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

Dann können Sie jetzt vor dem Anzeigen des Beitrags-Thumbnails Folgendes überprüfen:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}
Sam Margulies
quelle
Ich muss verhindern, dass ein Benutzer ein zu kleines Bild anfügt, und nicht, dass es angezeigt wird, wenn es zu klein ist. Jeder Beitrag muss ein Bild enthalten. Jeder Beitrag zeigt ein Bild.
Travis Pflanz
Müssten Tests machen, aber es gibt eine Möglichkeit, wie dies getan werden könnte: Immer wenn ein Upload erfolgreich war, ruft WP die Anhangsdaten über Ajax ab, um anschließend das Formular mit den Anhangsdetails anzuzeigen. Dies bedeutet, dass das Bild als Anhang eingefügt wurde und die Metadaten verfügbar sind. IDEE: Man könnte sich in attachments_fields_to_edit einbinden, das das Attachment-Objekt als Argument erhält, dann die Höhe und Breite der Metadaten prüfen. Wenn diese Prüfung fehlschlägt, das Formular mit den Anhangdetails nicht wie gewohnt anzeigen, stattdessen eine Fehlermeldung anzeigen und den Anhang sofort löschen . nur eine Idee.
ungestaltbar
@ungestaltbar, hört sich so an, als hättest du die richtige Idee. Ich bin kein Programmierer, also bin ich der Gemeinschaft ausgeliefert.
Travis Pflanz
0

Das wird was brauchen :)

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

Es wird get_the_post_thumbnail verwendet, was Ihnen möglicherweise auch weiterhilft, sodass Sie keinen Haufen fn-Code erstellen müssen, den WordPress bereits für Sie verarbeiten kann, nur ein Gedanke.

Dies wird verwendet $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));, um eine zufällige zu erfassen, wenn eine nicht vorhanden ist. Dies kann Ihnen helfen, voranzukommen.

Dieses Bit echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));beachte, dass 'small-thumb'es an die add_image_size fn angepasst wird, die wir ein paar Zeilen zusammenstellen. Wenn Sie es hätten add_image_size( 'small-square', 100, 100, true );, könnten Sie 'small-square'alternativ anrufen .

Prost

David
quelle
Danke für die Antwort. Das macht aber nicht was ich brauche. Die Website ist eine MLB-Baseball-Website, daher funktioniert ein zufälliges Bild von Albert Pujols nicht, um einem Artikel über Prince Fielder hinzugefügt zu werden, wenn Sie verstehen, was ich meine Benutzer zwingen, ein ausgewähltes Bild hinzuzufügen. Das Problem ist also nicht, ob sie ein Bild hinzufügen, sondern, dass ich sie zwingen möchte, ein Bild hinzuzufügen, das größer als 640 breit und 360 hoch ist.
Travis Pflanz