Wie erstellt WP Media Uploader die 3 Bilder in verschiedenen Größen und wie kann ich sie duplizieren?

17

Ich habe endlich !! Ich habe dieses Ding ungefähr 12 Mal ausprobiert und 12 verschiedene Arten, aber es hat endlich funktioniert, ... irgendwie.

Ich habe eine benutzerdefinierte Metabox für das Hochladen und Anhängen von Bildern an Beiträge erstellt, und Sie müssen nicht den in WP integrierten schrecklichen Thickbox-Medien-Uploader verwenden. Ich hasse das Ding. Nein, ich habe nur eine Gruppe von Eingaben (Titel, Beschreibung, Datei) vorgenommen, die Sie auch duplizieren können, um zusätzliche Anhänge hinzuzufügen, wenn Sie möchten. Füllen Sie also die Felder aus, wählen Sie ein Bild zum Hochladen aus und speichern Sie den Entwurf oder veröffentlichen Sie den Beitrag. Sobald einem Beitrag Anhänge hinzugefügt wurden, werden in der Metabox die Eingabefelder zusammen mit einem Vorschaubild des angehängten Bildes für jeden von Ihnen hinzugefügten Anhang angezeigt. Die Titel- und Beschreibungsfelder werden verwendet, um die Metadaten der Datei zu generieren. Es wird nichts als Post_Meta gespeichert, von dem ich weiß. Das ist derzeit alles, was ich bisher zu arbeiten bekommen habe.

Ich muss es so machen, dass beim Speichern / Veröffentlichen eines Beitrags, beim Hochladen / Erstellen der Anhangsdateien die drei Bildgrößen erstellt werden, wie es der standardmäßige WP-Uploader tun würde: Miniaturansicht, mittelgroß, groß und auch das Bild in voller Größe beibehalten . Wenn das irgendwie möglich ist. Andernfalls würde ich gerne add_image_size()neue benutzerdefinierte Größen erstellen / definieren und diese stattdessen beim Hochladen auf diese Weise generieren.

Ich bin mir nicht sicher, welche Funktion in diesem Fall am besten geeignet ist, vielleicht wäre die image_make_intermediate_size()Funktion besser, oder wp_create_thumbnail()oder wp_crop_image()... wer weiß !!

Ich kann nicht herausfinden, wie ich das machen soll, wenn ich die wp_handle_upload()Funktion für jede einzelne ausführen muss oder vielleicht etwas, das die wp_generate_attachment_metadata()Funktion betrifft . Es ist verwirrend für mich, da die 3 Bildgrößen als Varianten desselben Anhangs zugeordnet werden sollen, und wie man das macht.

Ich habe das Web durchsucht, die Quelle aller WP-Medien- / Upload- / Bild-bezogenen Dateien gelesen und mit nahezu jeder Funktion gespielt, die für das Hochladen von Medien zur Verfügung steht, und kann nicht feststellen, wie WP die 3 Bildgrößen an einem beliebigen Ort erstellt oder wie dies zu tun ist es selbst.

In wp-includes / media.php image_resize()sieht die Funktion so aus, als wäre sie am besten, da sie genau so ist, wie sie sein sollte. Ich kann für mein Leben einfach nicht herausfinden, was zum Teufel ich vermisse oder was ich versucht habe, aber falsch gemacht habe, um die Miniaturbilder zu erstellen.

Hier ist meine Arbeitsfunktion, die das wp_handle_upload()Zeug und die Dinge erledigt , aber sie muss auch den 100px-Thumb erstellen und eine Version des Bildes mit einer maximalen Breite von 500px erstellen und als neue Dateien des hochgeladenen Bildes speichern.

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

Jeder, der mir helfen kann, das Problem zu beheben, damit es richtig funktioniert, wäre begeistert. Ich habe so viele lächerliche, unzählige Stunden damit verbracht, dieses Ding zu entwickeln, und die Dokumentation ist zum Kotzen, und es gibt nirgendwo wirklich gute Beiträge, wie man es macht.

Vielen Dank

jaredwilli
quelle
Überprüfen Sie die Kommentare zu den verschiedenen Antworten unten und ich denke, entweder ich oder @ בניית אתרים oder wir beide sind verwirrt über das, was Sie brauchen.
MikeSchinkel
Hat jemand das gelöst ?? Haben Sie ein ähnliches Problem, haben Sie das Web für Alter auf diesem gebraust.

Antworten:

6

Hallo @jaredwilli:

Kumpel! Tapfere Bemühungen und gute Arbeit. Alles in allem könnte es eine großartige Ergänzung zu WordPress sein.

Sie waren so nah dran, aber Sie hatten irgendwo zwischen 5 und 10 kleine Fehlannahmen oder Code, der so aussah, als hätten Sie ihn gestartet, aber nicht darauf zurückgekommen, weil er nicht funktionierte. Ich habe Ihre Funktion nur so weit überarbeitet, wie ich es korrigieren musste. Die Lösung folgt und ich überlasse den direkten Vergleich Ihrer Person oder einer weniger ausgebrannten Person. :)

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

Hey, warum gönnst du dir nicht eine Kopie von PhpStorm ? Du hättest das leicht selbst lösen können, du warst sooo nah dran, wenn du nur den Code durchgegangen hättest, wie ich es jetzt kann. Verschwenden Sie in diesem Fall keine Zeit mit dem sehr fehlerhaften XDEBUG und laden Sie stattdessen Zend Debugger herunter .

PS Das ist meine frühere Antwort. Ich habe dies gepostet, bevor mir klar wurde, wonach Jared fragte. Es ist richtig, hat aber nichts mit seiner Frage zu tun. :)


Ich denke, was Sie suchen, ist add_image_size():

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

Beispielsweise:

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

Durch die Einstellung dieses WordPress werden diese Größen automatisch erstellt. Was ist das, was du brauchst?

MikeSchinkel
quelle
Da bin ich mir nicht sicher, er bittet um die Erstellung der Standardmediengrößen.
Bainternet
Hmm. Die Funktion wp_generate_attachment_metadata()macht das, wenn add_image_size()gesetzt ist. Vielleicht hat er einfach nicht versucht add_image_size(), die Bildgrößen einzustellen?
MikeSchinkel
Ja, aber Jaredwilli sagt, dass die in WordPress eingebauten Standardgrößen (groß, mittel, Thumbnail) nicht erstellt werden.
Bainternet
oder vielleicht bekomme ich die Frage gar nicht :)
Bainternet
@ בניית אתרים - Ich werde jetzt auch verwirrt. Ich denke, wir müssen hier die Klärung von @jaredwilli abwarten.
MikeSchinkel
0

Wenn ich Ihre Frage verstehe, müssen Sie zuerst die Liste der Größen wie folgt abrufen:

$image_sizes = get_intermediate_image_sizes();

Dies gibt ein Array aller registrierten Bildgrößen zurück (Standard: groß, mittel, Miniaturansicht, jede benutzerdefinierte Größe, die mit "add_image_size ()" registriert wurde). Dann müssen Sie nur eine Schleife durch jede der Größen ziehen und ein Bild für diese Größe wie erstellen Dies:

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

Ersetzen Sie $ file durch den hochgeladenen Dateipfad und $ crop durch true oder false, wenn Sie das Bild auf die neuen Dimensionen zuschneiden möchten oder false, um die Größe zu ändern.

Bainternet
quelle
@ בניית אתרים - Wenn Sie sich den Code für wp_generate_attachment_metadata()in ansehen, werden /wp-admin/includes/image.phpSie sehen, dass er genau das tut, was Sie oben gepostet haben, und er heißt bereits so. Wenn diese also nicht erstellt werden, hat er vielleicht ein Plugin, das sie mithilfe des Hooks filtert 'intermediate_image_sizes_advanced'?
MikeSchinkel
Ich hatte nicht versucht, get_intermediate_image_sizes () zu verwenden. Ich wusste nicht, dass es alle registrierten Größen hat. Welches ist jetzt schön zu wissen. Ich verstehe immer noch nicht ganz, wie die generierten Bildgrößen mit einem bestimmten Anhang verknüpft sind. Wenn Sie beispielsweise in der Medienbibliothek nachsehen, sehen Sie die drei Größenoptionen . Idk, das ist nicht so wichtig. Es sei denn, es ist. Nachdem ich diese foreach-Schleife durchgearbeitet habe, welche Variable würde ich verwenden, um den Anhang hinzuzufügen? $ images ['thumb'] oder so (welche Größe auch immer ich will)?
Jaredwilli
@ בניית אתרים - Wir haben beide zuerst das eigentliche Problem verpasst. Das eigentliche Problem waren etwa 7 oder 8 Codefehler im ursprünglichen Beispiel. Siehe meine aktualisierte Antwort.
MikeSchinkel
Ja, es war spät hier und ich war hirntot.
Bainternet
@ בניית אתרים - Gleiche. :)
MikeSchinkel