Как WP Media Uploader создает 3 изображения разных размеров, и как я могу их дублировать

17

У меня наконец то !! получил эту вещь, которую я пытался сделать 12 раз, и 12 разными способами, но, наконец, заставил ее работать, вроде как.

Я создал собственный метабокс для загрузки и прикрепления изображений к сообщениям, и он не требует от вас использования ужасного загрузчика файлов мультимедиа, встроенного в WP. Я ненавижу эту вещь. Нет, я сделал только группу входов (заголовок, описание, файл), которую вы также можете дублировать, чтобы добавить дополнительные вложения, если хотите. Таким образом, вы заполняете поля, выбираете изображение для загрузки и сохраняете черновик или публикуете сообщение. Как только в сообщение добавлены вложения, в метабоксе отобразятся поля ввода, а также изображение предварительного просмотра вложенного изображения для каждого добавленного вложения. Поля title и description используются для генерации метаданных файла, ничто не сохраняется как 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-includes / 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'] );
  }
}

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

Благодарность

jaredwilli
источник
Посмотрите комментарии к различным ответам ниже, и я думаю, что либо я, либо @ בניית אתרים, либо мы оба смущены тем, что вам нужно.
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 автоматически создаст эти размеры. Что то, что вам нужно?

MikeSchinkel
источник
Я не уверен в этом, он просит создать стандартные размеры носителей.
Bainternet
Хм. Функция wp_generate_attachment_metadata()делает это, если add_image_size()установлено. Может быть, он просто не пытался использовать add_image_size()для установки размеров изображения?
MikeSchinkel
да, но Джаредвилли говорит, что встроенные размеры 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); 
}

замените $ file на путь к загруженному файлу и $ crop на true или false, если вы хотите обрезать изображение до новых размеров или false для изменения размера.

Bainternet
источник
@ בניית אתרים - Если вы посмотрите на код для wp_generate_attachment_metadata()в /wp-admin/includes/image.phpвы увидите , что он делает именно то , что вы писали выше, и он уже назвал это. Так что, если они не создаются, то, возможно, у него есть плагин, который фильтрует их с помощью 'intermediate_image_sizes_advanced'хука?
MikeSchinkel
На самом деле я не пытался использовать get_intermediate_image_sizes (); Я не знал, что он получил все зарегистрированные размеры. Что приятно знать сейчас. Я до сих пор не совсем понимаю, как сгенерированные размеры изображения связаны с конкретным вложением, хотя, как если бы я смотрел в медиа-библиотеке, вы видите 3 варианта размера, при выборе одного из них он знает, какое изображение захватить , Идк, это не так важно. Если это не так. После выполнения цикла foreach, какую переменную я бы использовал для добавления вложения? $ images ['thumb'] или что-то еще (какого размера я хочу)?
Джаредвилли
@ בניית אתרים - Сначала мы оба пропустили реальную проблему. Реальная проблема была в 7 или 8 ошибках кода в исходном примере. Смотрите мой обновленный ответ.
MikeSchinkel
Да, это было поздно здесь, и я был мертвым мозгом.
Bainternet
@ בניית אתרים - То же самое. :)
MikeSchinkel