W jaki sposób program do przesyłania multimediów WP tworzy 3 obrazy o różnych rozmiarach i jak mogę je zduplikować

17

Nareszcie mam !! dostałem tę rzecz, którą próbowałem zrobić 12 razy i 12 różnych sposobów, ale w końcu udało mi się ...

Stworzyłem niestandardowy metaboks do przesyłania i dołączania zdjęć do postów i nie wymaga on używania okropnego programu do przesyłania multimediów typu „hardbox” wbudowanego w WP. Nienawidzę tego. Nie, to, co zrobiłem, to tylko grupa danych wejściowych (tytuł, opis, plik), które możesz również zduplikować, aby dodać dodatkowe załączniki, jeśli chcesz. Wypełniasz więc pola, wybierasz obraz do przesłania i zapisujesz wersję roboczą lub publikujesz post. Po dodaniu załączników do postu metabox wyświetli pola wprowadzania wraz z podglądem załączonego obrazu dla każdego dodanego załącznika. Pola tytułu i opisu służą do generowania metadanych pliku, nic nie jest zapisywane jako post_meta, o czym wiem. To wszystko, co do tej pory pracowałem.

Muszę to zrobić, aby po zapisaniu / opublikowaniu postu, ponownym przesłaniu / utworzeniu plików załączników utworzyłyby trzy rozmiary obrazów, tak jak domyślny program do przesyłania wp, miniatura, średni, duży i zachowując obraz w pełnym rozmiarze . Jeśli to w jakiś sposób możliwe. Jeśli nie, w innym przypadku chciałbym użyć add_image_size()do utworzenia / zdefiniowania nowych niestandardowych rozmiarów i wygenerowania ich w ten sposób po przesłaniu.

Nie jestem pewien, która funkcja jest najbardziej idealna do użycia w tym przypadku, może ta image_make_intermediate_size()funkcja byłaby lepsza, wp_create_thumbnail()lub wp_crop_image()... kto wie !!

Nie mogę wymyślić, jak to zrobić, jeśli muszę uruchomić wp_handle_upload()funkcję dla każdego z nich, a może coś z tą wp_generate_attachment_metadata()funkcją. Jest to dla mnie mylące, ponieważ 3 rozmiary obrazów należy powiązać jako warianty tego samego załącznika i jak to zrobić.

Przeszukałem sieć, przeczytałem źródło każdego pliku związanego z wp media / upload / image, i grałem z niemal każdą funkcją związaną z przesyłaniem multimediów i nie mogę znaleźć, w jaki sposób WP tworzy 3 rozmiary obrazów w dowolnym miejscu ani jak to zrobić ja sama.

W wp-obejmuje / media.php image_resize()funkcja wygląda najlepiej, ponieważ jest dokładnie taka, jak powinna być. Po prostu nie mogę ustalić, na co mnie stać, do diabła, za czym tęsknię lub co próbowałem zrobić, ale zrobiłem źle, tworząc miniatury obrazów.

Oto moja funkcja robocza, która wykonuje te wp_handle_upload()czynności, ale musi także utworzyć kciuk 100 pikseli i utworzyć wersję obrazu o maksymalnej szerokości, taką jak 500 pikseli, i zapisać jako nowe pliki przesłanego.

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

Każdy, kto może mi pomóc w końcu to naprawić, aby działał prawidłowo, byłby zachwycony. Spędziłem wiele niedorzecznych niezliczonych godzin, wiele różnych razy, starając się to rozwinąć, a dokumentacja jest do kitu, a nigdzie nie ma naprawdę dobrych postów na ten temat.

Dzięki

jaredwilli
źródło
Sprawdź komentarze do różnych odpowiedzi poniżej i myślę, że ja, @ בניית אתרים lub oboje jesteśmy zdezorientowani co do tego, czego potrzebujesz.
MikeSchinkel 30.01.11
Czy ktoś to rozwiązał? Mając podobny problem, od wieków przeglądam sieć.

Odpowiedzi:

6

Cześć @jaredwilli:

Koleś! Dzielny wysiłek i miła praca. Podsumowując, może to być świetny dodatek do WordPress.

Byłeś tak blisko, ale miałeś gdzieś od 5 do 10 drobnych nieudanych założeń lub kodu, który wygląda jakbyś go uruchomił, ale nie wrócił do niego, ponieważ nie działał. Przerobiłem twoją funkcję tylko tyle, ile potrzebowałem, aby ją poprawić. Rozwiązanie następuje i pozostawię porównanie obok ciebie lub mniej wypalonej osoby. :)

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

Hej, czemu nie wyszaleć się i zdobyć sobie kopię PhpStorm ? Mogłeś łatwo rozwiązać to sam, byłeś tak blisko, gdybyś mógł po prostu prześledzić kod, tak jak teraz. Jeśli tak, nie marnuj czasu na bardzo błędny XDEBUG i zamiast tego pobierz Zend Debugger .

PS To moja poprzednia odpowiedź. Opublikowałem to, zanim zdałem sobie sprawę, o co dokładnie pytał Jared. To prawda, ale niezwiązana z jego pytaniem. :)


Myślę, że szukasz add_image_size():

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

Na przykład:

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

Po ustawieniu tego WordPress automatycznie utworzy te rozmiary. Czego potrzebujesz?

MikeSchinkel
źródło
Nie jestem tego pewien, on prosi o utworzenie domyślnych rozmiarów nośników.
Bainternet,
Hmm Funkcja wp_generate_attachment_metadata()robi to, jeśli add_image_size()jest ustawiona. Może po prostu nie próbował użyć add_image_size()rozmiarów obrazu?
MikeSchinkel
tak, ale jaredwilli mówi, że nie są tworzone domyślne wbudowane rozmiary WordPress (duży, średni, miniatura), więc dodatkowe rozmiary dodawane za pomocą add_image_size () również nie zostaną utworzone.
Bainternet,
a może w ogóle nie otrzymuję pytania :)
Bainternet 30.01.11
@ בניית אתרים - Teraz też się mylę. Myślę, że musimy poczekać na wyjaśnienia z @jaredwilli.
MikeSchinkel
0

jeśli rozumiem twoje pytanie, najpierw musisz uzyskać listę rozmiarów:

$image_sizes = get_intermediate_image_sizes();

to zwraca tablicę wszystkich zarejestrowanych rozmiarów obrazu (domyślnie: duży, średni, miniatura, dowolny niestandardowy rozmiar zarejestrowany za pomocą „add_image_size ()”, wtedy wszystko, co musisz zrobić, to przejść przez każdy z tych rozmiarów i utworzyć obraz o takim rozmiarze, jak to:

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

zamień $ file na przesłaną ścieżkę pliku, a $ crop na true lub false, jeśli chcesz przyciąć obraz do nowych wymiarów lub false, aby zmienić rozmiar.

Bainternet
źródło
@ בניית אתרים - Jeśli spojrzeć na kod dla wp_generate_attachment_metadata()w /wp-admin/includes/image.phpwidać, że robi dokładnie to, co napisali powyżej, a on jest już nazywa to. Więc jeśli nie są tworzone, to może ma wtyczkę, która filtruje je za pomocą 'intermediate_image_sizes_advanced'haka?
MikeSchinkel
Właściwie nie próbowałem użyć get_intermediate_image_sizes (); Nie wiedziałem, że ma wszystkie zarejestrowane rozmiary. Co miło wiedzieć teraz. Nadal nie do końca rozumiem, w jaki sposób generowane rozmiary obrazów są powiązane z konkretnym załącznikiem, na przykład, gdybym zajrzał do biblioteki multimediów, zobaczysz 3 opcje rozmiaru, wybierając jedną z nich, wie, który obraz pobrać . Idk, to nie jest tak ważne. Chyba że tak. Jednak po wykonaniu tej pętli foreach jakiej zmiennej użyłbym do dodania załącznika? $ images [„kciuk”] czy coś (jaki rozmiar chcę)?
jaredwilli 30.01.11
@ בניית אתרים - Oboje z początku przegapiliśmy prawdziwy problem. Prawdziwy problem dotyczył około 7 lub 8 błędów kodu w oryginalnym przykładzie. Zobacz moją zaktualizowaną odpowiedź.
MikeSchinkel 30.01.11
Tak, było już późno i byłem martwy.
Bainternet,
@ בניית אתרים - Same. :)
MikeSchinkel,