Як завантажувач медіа WP створює 3 зображення різних розмірів, і як я можу їх дублювати


17

Я нарешті !! я отримав цю річ, яку я пробував близько 12 разів, і 12 різних способів, але нарешті змусив її працювати, ...

Я створив спеціальний метабокс для завантаження та прикріплення зображень до публікацій, і це не вимагає від вас жахливого завантажувача медіа-завантажувачів, вбудованого в WP. Я ненавиджу цю річ. Ні, те, що я зробив, - це лише група входів (назва, опис, файл), які ви також можете дублювати, щоб додати додаткові вкладення, якщо хочете. Отже, ви заповнюєте поля, вибираєте зображення для завантаження та зберігаєте чернетку або публікуєте публікацію. Щойно до публікації додаються вкладення, метабокс відображатиме поля введення разом із попереднім зображенням доданого зображення для кожного доданого вами вкладеного файлу. Поля заголовка та опису використовуються для генерування метаданих файлів, нічого не зберігається як post_meta, про який я знаю. Наразі це все, що я зараз працював.

Мені потрібно зробити так, що коли ви зберігаєте / публікуєте публікацію, вбудовуєте завантаження / створюєте файли вкладень, вона створить три розміри зображення, як завантажувач wp за замовчуванням, мініатюра, середній, великий, а також збереження зображення в повному розмірі . Якщо це можливо якось. Якщо ні, то я б хотів інакше використовувати add_image_size()для створення / визначення нових спеціальних розмірів, а також генерувати їх таким чином, після завантаження.

Я не впевнений, яку функцію найкраще використовувати в цьому випадку, можливо, ця image_make_intermediate_size()функція була б кращою, wp_create_thumbnail()або wp_crop_image()... хто знає !!

Я не можу зрозуміти, як мені це робити, якщо мені потрібно запустити wp_handle_upload()функцію для кожного з них, або, можливо, щось із цим пов'язане wp_generate_attachment_metadata(). Мене це бентежить, оскільки 3 розміри зображення мають бути пов'язані як варіанти одного вкладеного файлу, і як це зробити.

Я переглянув Інтернет, прочитав джерело кожного файлу, пов’язаного з WP-медіа / завантаження / зображення, і грав майже з кожною функцією для завантаження медіа, і не можу знайти, як WP створює 3 розміри зображень у будь-якому місці або як це зробити це я сам.

У wp-include / media.php image_resize()функція виглядає так, як це було б найкраще, оскільки це саме те, що має бути. Я просто не можу за все життя зрозуміти, чого я, мабуть, пробував чи намагався робити, але зробив неправильно, щоб зробити ескізи зображення.

Ось моя робоча функція, яка виконує wp_handle_upload()речі та речі, але вона також повинна створити великий палець у 100 пікселів та зробити версію розміру зображення, максимальної ширини як 500 пікселів, та зберегти як нові файли завантаженого файлу.

function update_attachment(){
  global $post;

  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );

  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $url = wp_handle_upload( $_FILES['a_image'], $override );

    // $medium = image_make_intermediate_size( $uploaded_file['url'], 500, 400, true );
    // $thumb = = image_make_intermediate_size( $uploaded_file['url'], 100, 100, true );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $array_type = wp_check_filetype
    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

    $name_parts = pathinfo( $name );
    $name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] )) ));

    $type = $file['type'];
    $file = $file['file'];
    $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
    $content = $_POST['a_desc']

    $post_id = $post->ID;
    $attachment = array(
      'post_title' => $title,
      'post_type' => 'attachment',
      'post_content' => $content,
      'post_parent' => $post_id,
      'post_mime_type' => $type,
      'guid' => $url['url']
    );


    // Save the data
    $id = wp_insert_attachment( $attachment, $_FILES['a_image'][ 'file' ]/*, $post_id - for post_thumbnails*/);

    if ( !is_wp_error( $id )) {
      $attach_meta = wp_generate_attachment_metadata( $id, $uploaded_file['url'] );
      wp_update_attachment_metadata( $attach_id, $attach_meta );
    }
    update_post_meta( $post->ID, 'a_image', $uploaded_file['url'] );
  }
}

Кожен, хто зможе допомогти мені остаточно виправити це, щоб він працював належним чином, був би полюбленим. Я провів стільки смішних незліченних годин чимало різних часів, намагаючись розробити цю річ, і документація відстійна, і ніде не існує хороших дописів, як це зробити.

Спасибі


Перегляньте коментарі до різних відповідей нижче, і я думаю, що я або @ בניית אתרים або ми обидва плутаємось у тому, що вам потрібно.
MikeSchinkel

Хтось вирішив це ?? Маючи подібну проблему, протягом цього століття віємо в Інтернеті.

Відповіді:


6

Привіт @jaredwilli:

Чувак! Доблесні зусилля та приємна робота. Все-у-всьому це може бути чудовим доповненням до WordPress.

Ви були так близько, але у вас було десь від 5 до 10 маленьких невдалих припущень чи коду, схожого на те, що ви його почали, але не повернулися до нього, оскільки він не працював. Я переробив вашу функцію лише стільки, скільки мені потрібно було, щоб її виправити. Вирішення випливає, і я залишу побічне порівняння з вашим чи кимось менш вигорілим. :)

function update_attachment() {
  global $post;
  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );
  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $file = wp_handle_upload( $_FILES['a_image'], $override );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $file_type = wp_check_filetype($_FILES['a_image']['name'], array(
      'jpg|jpeg' => 'image/jpeg',
      'gif' => 'image/gif',
      'png' => 'image/png',
    ));
    if ($file_type['type']) {
      $name_parts = pathinfo( $file['file'] );
      $name = $file['filename'];
      $type = $file['type'];
      $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
      $content = $_POST['a_desc'];

      $post_id = $post->ID;
      $attachment = array(
        'post_title' => $title,
        'post_type' => 'attachment',
        'post_content' => $content,
        'post_parent' => $post_id,
        'post_mime_type' => $type,
        'guid' => $file['url'],
      );

      foreach( get_intermediate_image_sizes() as $s ) {
        $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => true );
        $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
        $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
        $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
      }

      $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );

      foreach( $sizes as $size => $size_data ) {
        $resized = image_make_intermediate_size( $file['file'], $size_data['width'], $size_data['height'], $size_data['crop'] );
        if ( $resized )
          $metadata['sizes'][$size] = $resized;
      }

      $attach_id = wp_insert_attachment( $attachment, $file['file'] /*, $post_id - for post_thumbnails*/);

      if ( !is_wp_error( $id )) {
        $attach_meta = wp_generate_attachment_metadata( $attach_id, $file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_meta );
      }
      update_post_meta( $post->ID, 'a_image', $file['url'] );
    }
  }
}

Гей, чому б не розвіситись і придбати собі копію PhpStorm ? Ви могли б легко вирішити це самостійно, ви були так близько, якби ви могли просто простежити код, як я зараз можу. Якщо ви все-таки не витрачайте час на дуже гнучку XDEBUG, а замість цього завантажуйте Zend Debugger .

PS Це моя колишня відповідь. Я розмістив це ще до того, як зрозумів, що саме Джаред просить. Це правильно, але не пов’язано з його питанням. :)


Я думаю, що ти шукаєш add_image_size():

add_image_size( $size_id, $width, $height, $crop );

Наприклад:

add_image_size('headshot', 130, 150);
add_image_size('large-headshot', 260, 300);

Встановивши цю WordPress, ці розміри будуть створені автоматично. Що то, що тобі було потрібно?


Я не впевнений у цьому, він просить створити типовий розмір медіа.
Бейнтернет

Хм. Функція wp_generate_attachment_metadata()робить це, якщо add_image_size()встановлено. Може, він просто не намагався використовувати add_image_size()для встановлення розмірів зображення?
MikeSchinkel

Так, але jaredwilli говорить про те, що вбудовані розміри WordPress за замовчуванням (великі, середні, мініатюрні) не створюються, тоді надмірні додаткові розміри за допомогою add_image_size () також не будуть створені.
Bainternet

а може, я взагалі не отримую питання :)
Bainternet

@ בניית אתרים - зараз я теж заплутався. Я думаю, нам потрібно чекати, коли тут з’ясуються роз'яснення від @jaredwilli.
MikeSchinkel

0

якщо я розумію, що ви запитуєте, вам потрібно спочатку отримати список розмірів, як це:

$image_sizes = get_intermediate_image_sizes();

це повертає масив усіх зареєстрованих розмірів зображень (за замовчуванням: великий, середній, мініатюра, будь-який спеціальний розмір, зареєстрований за допомогою "add_image_size ()", тоді все, що вам потрібно зробити, - провести цикл через кожен з розмірів і створити зображення для такого розміру, як це:

$foreach ($image_sizes as $size){
    images[] = image_make_intermediate_size($file, $size['width'], $size['height'], $crop); 
}

замініть файл $ на завантажений шлях до файлу, а $ crop - на істинне або хибне, якщо ви хочете обрізати зображення до нових розмірів або false для зміни розміру.


@ בניית אתרים - Якщо ви подивитесь на код wp_generate_attachment_metadata()у ньому /wp-admin/includes/image.php, то побачите, що він робить саме те, що ви розмістили вище, і він уже так називається. Тож якщо вони не створюються, можливо, у нього є плагін, який фільтрує їх за допомогою 'intermediate_image_sizes_advanced'гачка?
MikeSchinkel

Я фактично не намагався використовувати get_intermediate_image_size (); Я не знав, що він отримав усі зареєстровані розміри. Що приємно знати зараз. Я все ще не дуже розумію, як згенеровані розміри зображень асоціюються з конкретним вкладенням, хоча, як якщо б я шукав у медіатеці, ви бачите варіанти 3 розмірів, коли вибираєте одне із них, воно знає, яке зображення захопити . Idk, це не так важливо. Якщо тільки це не так. Після цього циклу foreach яку змінну я б використав, щоб додати вкладення? $ images ['thumb'] чи щось таке (якого б розміру я не хотів)?
jaredwilli

@ בניית אתרים - Ми обоє спочатку пропустили справжню проблему. Справжня проблема полягала приблизно в 7 або 8 помилках коду в оригінальному прикладі. Дивіться мою оновлену відповідь.
MikeSchinkel

Так, тут було пізно, і я загинув мозку.
Бейнтернет

@ בניית אתרים - Те саме. :)
MikeSchinkel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.