Wymagane minimalne wymiary dla wyróżnionego obrazu?

14

Tworzę witrynę baseballową z wieloma autorami. Z przeszłych doświadczeń, bez względu na to, jak dobrze znasz kogoś osobiście, nie oznacza to, że będą postępować, a nawet czytać twoje instrukcje.

Biorąc to pod uwagę, chciałbym wymagać, aby każdy obraz, który Autor zdecyduje się na „Użyj jako wyróżnionego obrazu”, miał co najmniej 640 pikseli szerokości i co najmniej 360 pikseli wysokości.

Wymagałem, aby każdy post miał wyróżniony obraz przy użyciu wtyczki WyPiekacz ; post nie zostanie opublikowany bez wyróżnionego obrazu. Zablokowałem autorowi możliwość tworzenia linku do innej witryny, usuwając kartę „Z adresu URL” w Dodaj media za pomocą kodu Bainternet.

Teraz muszę wymagać, aby każdy obraz użyty jako wyróżniony obraz miał co najmniej 640 na 360 pikseli. Nie jestem koderem, ale bawiłem się i próbowałem użyć kodu Maora Barazany'ego jako punktu wyjścia, ale bezskutecznie. Jego kod wymusza minimalne wymiary każdego przesyłanego obrazu .

Travis Pflanz
źródło
Nie mogę odpowiedzieć na twoje pytanie, ale muszę podziękować za fajną kolekcję przydatnych filtrów i funkcji;)
Ole Henrik Skogstrøm
to samo, Ole Henrik :)
brasofilo
Co z obrazami, które są dołączone do postów, ale nie mają być używane jako obraz polecany z postem? Czy to absolutnie niemożliwe, aby do każdego postu dołączono tylko wybrane zdjęcia?
Chip Bennett
Nie, ale każdy post musi mieć wyróżniony obraz. Jest to główny powód, dla którego kod Maora Barazany'ego (link powyżej) wymusza min. wymiary po przesłaniu nie działały (lub kod Ungestaltbar poniżej). Te fragmenty kodu wymuszają WSZYSTKIE przesłane obrazy do minimalnych wymiarów. Użytkownicy mogą dodawać dodatkowe zdjęcia do swoich postów, ale „Wyróżniony obraz” musi być wystarczająco duży, aby pasował do motywu bez rozciągania. Dlatego też chcę kolumny „Wymiary obrazu” na karcie „Biblioteka multimediów” programu do przesyłania. Użytkownicy będą mogli szybko wybrać obraz wystarczająco duży dla wyróżnionego obrazu.
Travis Pflanz,
I dostać że chcesz wszystkie posty mieć do Ciekawa obraz. Ale czy zawsze będzie to jedyne zdjęcie dołączone do postów? Lub może posty mają inne obrazy w uzupełnieniu do tej Ciekawa obrazu?
Chip Bennett

Odpowiedzi:

2

cóż, jeśli używasz wtyczki WyPiekacz; jak już powiedziałeś, aby sprawdzić, czy polecany obraz jest przesłany, możesz go trochę ulepszyć, aby sprawdzić, czy jeśli polecany obraz ma minimalne wymiary, zgodnie z wymaganiami.

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

Możesz zmienić powyższy kod w wypiekacz.php na,

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

cóż, nie rozumiem, co masz na myśli przez „Media Library Tab”.

Rajeev Vyas
źródło
Jesteś pięknym mężczyzną! Działa świetnie! „Karta biblioteki multimediów” znajduje się na ekranie przesyłania multimediów, na przykład po kliknięciu „Ustaw polecany obraz” lub „Prześlij / Wstaw” dla multimediów. Oto zrzut ekranu mojego pomysłu - picasaweb.google.com/lh/photo/…
Travis Pflanz,
Dokonałem jednej zmiany. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');zmieniono, aby list($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0];sprawdzić wymiary tylko wyróżnionego obrazu, a nie wszystkich dołączonych obrazów.
Travis Pflanz,
@TravisPflanz Jest to funkcja, która wyświetla wiersz „Tabeli biblioteki medialnejcodex.wordpress.org/Function_Reference/get_media_item Nie ma tu filtra, więc nie sądzę, że można go zmienić bez przechwytywania do pliku wordpress .... Możesz zaakceptować odpowiedź / głosowanie, jeśli przydatne ......
Rajeev Vyas,
2

Sprawdziłem rdzeń i najwyraźniej jest niewiele miejsca na manewrowanie.

/wp-admin/include/media.php to miejsce, w którym generowane są zakładki Dodaj media

Funkcja get_media_item w linii 1034 to ta, która renderuje tabelę załączników / multimediów. Nie widzę w nim żadnego filtra ani poprzednich funkcji, które go wywołują.

Niektóre referencje i przykłady kodu dotyczące tego problemu.

Wydaje mi się, że alternatywnym rozwiązaniem byłoby zmienić tytuł przesłanych zdjęć i dołączyć ich wymiary. Nie jestem pewien co do zmiany post_title przesłanego pliku, ale zmianę nazwy samego pliku można uzyskać za pomocą tych dwóch filtrów: sanitize_file_name i wp_handle_upload_prefilter

brasofilo
źródło
Więc mówisz, że to może być możliwe ... Może? Naprawdę nie jestem programistą, więc jestem na łasce innych, jeśli chodzi o funkcje pisania. Każde wsparcie byłoby świetne.
Travis Pflanz,
1

Nie jest to pełna odpowiedź i nie nagroda, tylko dowód na to, że podstawowa koncepcja działa:

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

Tylko 60-sekundowy fragment kodu i ma jeden duży problem: będzie uruchamiany przy każdym przesyłaniu, i to nie tylko wtedy, gdy ktoś będzie chciał dodać wyróżniony obraz, ponieważ nie mamy sposobu na uzyskanie kontekstu przesyłającego obraz. Istnieje kilka sposobów obejścia tego, w zasadzie za pomocą manipulacji js.

Powinienem teraz pracować i nie mam czasu na eksperymentowanie z tym. Ale chciałem pomóc, jak mogłem, i może to jest punkt wyjścia dla innych.

Twoje zdrowie

ungestaltbar
źródło
Dzięki za odpowiedź, twój kod robi w zasadzie to, co robi kod Maora Barazany'ego (co jest powiązane w pytaniu), chociaż twój jest znacznie lepszy.
Travis Pflanz,
1

To nie jest najbardziej elegancka odpowiedź ... ale działa! Wtyczka „WyPiekacz”, choć fajna, nie była aktualizowana od trzech lat.

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

Najbardziej eleganckie rozwiązanie z najlepszym doświadczeniem użytkownika wykorzystałoby JavaScript do obsługi tego zarówno w przypadku Szybkiej edycji, jak i strony edycji postów. Potem na szczęście dodam coś doupdate_post_metadata filtra (co całkowicie działa na rzecz zapobiegania polecanemu obrazowi, ale nie daje ostrzeżenia, ponieważ działa z AJAX).

Powiadomienia administratora nie pojawią się, ponieważ WordPress przekierowuje, a nawet wtedy nie pojawiłby się w Szybkiej Edycji (moja metoda wyświetla ostrzeżenie w Szybkiej Edycji, chociaż nie jest stylizowana).

Ryan Taylor
źródło
Czy zostało to przetestowane? Od jakiegoś czasu nie musiałem tego robić, ale fajnie jest dodać do zakładek.
Travis Pflanz,
Może w poniedziałek mogę uruchomić go na naszym serwerze testowym, ale mam coś w 99% podobnego do tego uruchomionego na produkcji.
Ryan Taylor
0

Oto jeden ze sposobów upewnienia się, że przed wyświetleniem jest odpowiednia miniatura.

Najpierw utwórz tę funkcję pomocnika:

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

Następnie możesz teraz sprawdzić przed wyświetleniem miniatury postu:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}
Sam Margulies
źródło
Muszę ograniczyć użytkownikowi możliwość dołączania obrazu, który jest zbyt mały, a nie ograniczania wyświetlania, jeśli jest zbyt mały. Każdy post MUSI zawierać obraz. Każdy post wyświetli obraz.
Travis Pflanz,
Musiałbym wykonać testy, ale jest jeden sposób, w jaki widzę, jak można to zrobić: Za każdym razem, gdy przesyłanie się powiedzie, WP pobierze dane załącznika za pośrednictwem ajax, aby wyświetlić formularz szczegółów załącznika. Oznacza to, że obraz został wstawiony jako załącznik, a metadane są dostępne. IDEA: Można podłączyć do attachments_fields_to_edit, który pobiera obiekt załącznika jako argument, a następnie sprawdzić wysokość i szerokość metadanych, jeśli to sprawdzenie nie powiedzie się, jak zwykle nie wyświetlaj formularza szczegółów załącznika, zamiast tego pokaż komunikat o błędzie i natychmiast usuń załącznik . tylko pomysł.
ungestaltbar
@ungestaltbar, brzmi jak masz dobry pomysł. Nie jestem programistą, więc jestem na łasce społeczności.
Travis Pflanz,
0

To zrobi, czego potrzebujesz :)

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

Korzysta z get_the_post_thumbnail, który może ci również pomóc, więc nie musiałeś tworzyć zestawu kodu fn, który WordPress może już dla ciebie obsłużyć, tylko myśl.

Służy $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));do przechwytywania losowego, jeśli go nie ma, co może pomóc ci iść do przodu.

Ten bit echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));Zawiadomienie 'small-thumb'to zostanie dopasowane do tych add_image_size FN znajduje się ułożyła się kilka linii. Więc gdybyś miał, add_image_size( 'small-square', 100, 100, true );możesz zadzwonić 'small-square'alternatywnie.

Twoje zdrowie

David
źródło
Dziękuję za odpowiedź. Nie robi to jednak tego, czego potrzebuję. Witryna jest witryną baseballową MLB, więc losowe zdjęcie Alberta Pujolsa nie będzie działać, jeśli zostanie dodane do artykułu o Prince Fielder, jeśli zrozumiesz, co mam na myśli ... Ponadto, jak wspomniałem powyżej, używam wtyczki WyPiekacz, aby zmusić użytkowników do dodania wyróżnionego obrazu. Problem nie polega na tym, czy dodają obraz, ale na tym, że chcę zmusić go do dodania obrazu o szerokości większej niż 640 i wysokości 360.
Travis Pflanz,