Требование минимальных размеров для избранного изображения?

14

Я создаю бейсбольный сайт с несколькими авторами. Из прошлого опыта, независимо от того, насколько хорошо вы знаете кого-то лично, это не значит, что они будут следовать или даже читать ваши инструкции.

При этом я хотел бы потребовать, чтобы любое изображение, которое Автор решает «Использовать в качестве рекомендуемого изображения», имело ширину не менее 640 пикселей и высоту не менее 360 пикселей.

Я потребовал, чтобы в каждом сообщении было Лучшее изображение с помощью плагина WyPiekacz ; сообщение не будет опубликовано без избранного изображения. Я заблокировал для автора возможность создания горячей ссылки на другой сайт, удалив вкладку «С URL» в «Добавить медиафайл» с помощью кода Bainternet.

Теперь мне нужно, чтобы любое изображение, используемое в качестве рекомендуемого изображения, имело размер не менее 640 на 360 пикселей. Я вовсе не программист, но я играю и пытаюсь использовать код Маора Баразани в качестве отправной точки, но безрезультатно. Его код устанавливает минимальные размеры для любого загружаемого изображения .

Трэвис Пфланц
источник
Не могу ответить на ваш вопрос, но я должен сказать спасибо за хорошую коллекцию удобных фильтров и функций;)
Ole Henrik Skogstrøm
То же самое
Как насчет изображений, которые прикреплены к сообщениям, но не предназначены для использования в качестве избранного изображения? Это абсолютно невозможно , что каждый пост будет когда - либо только присоединили Post Рекомендуемые изображения?
Чип Беннетт
Нет, но в каждом сообщении должно быть изображение. Это главная причина, по которой код Маора Баразани (ссылка выше) заставляет мин. Размеры при загрузке не будут работать (или код ungestaltbar ниже). Эти фрагменты кода заставляют ВСЕ загруженные изображения к минимальным размерам. Пользователи могут добавлять дополнительные изображения в свои сообщения, но «Избранные изображения» должны быть достаточно большими, чтобы соответствовать теме без растяжения. Вот почему мне нужен столбец «Размеры изображения» на вкладке «Медиатека» программы загрузки. Пользователи быстро смогут выбрать изображение, достаточно большое для показанного изображения.
Трэвис Пфланц
Я получить , что вы хотите , чтобы все сообщения , чтобы иметь более Показанное изображение. Но будет , что всегда будет на только изображение , прикрепленный к столбам? Или посты могут иметь другие изображения в дополнение к избранному изображению?
Чип Беннетт

Ответы:

2

хорошо, если вы используете плагин WyPiekacz; как вы сказали для проверки того, что выбранное изображение загружено, вы можете немного его настроить, чтобы убедиться, что если есть выбранное изображение, оно имеет минимальные размеры, как вам требуется.

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

Вы можете изменить вышеуказанный код в wypiekacz.php на,

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

ну, я не понимаю, что вы имеете в виду под "Media Library Tab".

Раджив Вьяс
источник
Вы красивый мужчина! Работает отлично! «Вкладка библиотеки мультимедиа» находится на экране загрузки мультимедиа, например, когда вы нажимаете «Установить рекомендуемое изображение» или «Загрузить / вставить» для мультимедиа. Вот скриншот моей идеи - picasaweb.google.com/lh/photo/...
Travis Pflanz
Я сделал одно изменение. list($url, $width, $height) = wp_get_attachment_image_src($post_id, 'full');изменился наlist($url, $width, $height) = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), "Full"); echo $imgsrc[0]; чтобы проверить размеры только избранного изображения, а не всех прикрепленных изображений.
Трэвис Пфланц
@TravisPflanz Это функция, которая выводит строку «Медиальной вкладки библиотеки» вкладки codex.wordpress.org/Function_Reference/get_media_item Здесь нет фильтра, поэтому я не думаю, что вы можете изменить его без перехвата в файл WordPress .... Вы можете принять ответить / ответить, если полезно ......
Раджив Вьяс
2

Я проверил ядро ​​и, видимо, там мало места для маневрирования.

/wp-admin/includes/media.php - это место, где создаются вкладки «Добавить медиа»

Функция get_media_item в строке 1034 - это та, которая визуализирует таблицу вложений / медиа. Я не вижу ни одного доступного фильтра в нем, ни предыдущих функций, которые его вызывают.

Некоторые ссылки и примеры кода вокруг проблемы.

Я предполагаю, что альтернативным решением было бы изменить название загруженных изображений и добавить его размеры. Я не уверен относительно изменения post_title загруженного файла, но переименование самого файла может быть достигнуто с помощью этих двух фильтров: sanitize_file_name и wp_handle_upload_prefilter

brasofilo
источник
Итак, вы говорите, что это возможно ... Может быть? Я действительно не кодер, поэтому я во власти других, когда дело доходит до написания функций. Любая поддержка будет отличной.
Трэвис Пфланц
1

Не полный ответ и не для награды, просто доказательство того, что основная концепция работает:

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

Просто 60secondsSnippet и имеет одну большую проблему: это будет срабатывать при каждой загрузке, и не только, если кто-то собирается добавить избранное изображение, потому что у нас нет способа получить контекст загрузчика изображения. Есть несколько способов обойти это, в основном с некоторыми манипуляциями с JS.

Я должен работать прямо сейчас, и у меня нет времени экспериментировать с этим. Но я хотел помочь как можно больше, и, возможно, это отправная точка для других.

ура

ungestaltbar
источник
Спасибо за ответ, ваш код, по сути, делает то же, что и код Маора Баразани (который связан с вопросом), хотя ваш код намного лучше.
Трэвис Пфланц
1

Это не самый элегантный ответ ... но он работает! Плагин WyPiekacz, хотя и крутой, не обновлялся в течение трех лет.

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

Наиболее элегантное решение с лучшим пользовательским интерфейсом будет использовать JavaScript, чтобы справиться с этим как для быстрого редактирования, так и для страницы редактирования. Тогда, к счастью, я добавлю что-то в update_post_metadataфильтр (который полностью предотвращает показ изображения, но не выдает предупреждение, так как он запускается с AJAX).

Уведомления администратора не будут отображаться, потому что WordPress перенаправляет, и даже в этом случае не будет отображаться при быстром редактировании (мой метод отображает предупреждение при быстром редактировании, хотя оно не имеет стиля).

Райан Тейлор
источник
Это было проверено? Мне не нужно было делать это какое-то время, но приятно добавить в закладки.
Трэвис Пфланц
Возможно, в понедельник я смогу запустить его на нашем промежуточном сервере, но у меня есть кое-что на 99% похожее на то, что работает на производстве.
Райан Тейлор
0

Вот один из способов убедиться, что миниатюра правильного размера перед отображением.

Сначала создайте эту вспомогательную функцию:

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

Затем вы можете проверить перед отображением миниатюры сообщения:

if( has_post_thumbnail_of_size(640, 360) ) {
    the_post_thumbnail();
}
Сэм Маргулис
источник
Мне нужно запретить пользователю прикреплять слишком маленькое изображение, а не ограничивать его отображение, если оно слишком маленькое. Каждый пост ДОЛЖЕН включать изображение. Каждый пост будет отображать изображение.
Трэвис Пфланц
Пришлось бы провести тесты, но я вижу, как это можно сделать одним способом: всякий раз, когда загрузка прошла успешно, WP извлекает данные вложения через ajax, чтобы потом отобразить форму сведений о вложениях. Это означает, что изображение было вставлено как вложение, и метаданные доступны. IDEA: можно подключиться к attachments_fields_to_edit, который получает объект вложения в качестве аргумента, затем проверить высоту и ширину метаданных, если эта проверка не пройдена, не показывать форму сведений о вложении как обычно, вместо этого показать сообщение об ошибке и немедленно удалить вложение , просто идея.
ungestaltbar
@ungestaltbar, похоже, у вас есть правильная идея. Я не кодер, поэтому я во власти сообщества.
Трэвис Пфланц
0

Это будет делать то, что нужно :)

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

Он использует get_the_post_thumbnail, который также может помочь вам, поэтому вам не нужно создавать кучу кода Fn, который WordPress уже может обработать для вас, просто мысль.

Используется $thumbnails = get_posts(array('numberposts'=>1,'orderby'=>'rand','meta_key' => '_thumbnail_id'));для получения случайного, если его нет, это может помочь вам двигаться вперед.

Этот бит echo get_the_post_thumbnail($thumbnail->ID, 'small-thumb', array( 'alt' => esc_attr( $post->post_title ), 'title' => esc_attr( $post->post_title ) ));замечает, что 'small-thumb'он соответствует тем add_image_size fn, которые мы собрали в несколько строк. Так что, если бы вы имели, add_image_size( 'small-square', 100, 100, true );вы могли бы позвонить в качестве 'small-square'альтернативы.

ура

Дэвид
источник
Спасибо за ответ. Это не делает то, что мне нужно, однако. Этот веб-сайт является веб-сайтом MLB для бейсбола, поэтому случайная картина Альберта Пухольса не подойдет для добавления в статью о принце Филдере, если вы поймете, что я имею в виду ... Кроме того, как я уже упоминал выше, я использую плагин WyPiekacz для заставлять пользователей добавлять избранные изображения. Таким образом, проблема заключается не в том, добавляют ли они изображение, а в том, что я хочу заставить их добавить изображение шириной более 640 и высотой 360.
Трэвис Пфланц