web-dev-qa-db-de.com

Wie geht das? WP media uploader erstellt die 3 unterschiedlich großen Bilder und wie kann ich sie duplizieren?

Ich habe endlich !! Ich habe dieses Ding ungefähr 12 Mal ausprobiert und 12 verschiedene Arten, aber schließlich hat es 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. Sie füllen also die Felder aus, wählen ein Bild zum Hochladen aus und speichern den Entwurf oder veröffentlichen 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, Mittel, Groß und auch das Bild in voller Größe . Wenn das irgendwie möglich ist. Andernfalls möchte ich add_image_size() verwenden, um neue benutzerdefinierte Größen zu erstellen/zu definieren und sie stattdessen beim Hochladen auf diese Weise zu generieren.

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

Ich kann nicht herausfinden, wie ich das machen soll, wenn ich die Funktion wp_handle_upload() für jede einzelne ausführen muss, oder vielleicht etwas mit der Funktion wp_generate_attachment_metadata(). 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 erstellt überall oder wie ich es selbst mache.

In wp-includes/media.php sieht die Funktion image_resize() so aus, als wäre sie am besten geeignet, 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 wp_handle_upload() erledigt, aber 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 muss.

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, wird geliebt. 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

16
jaredwilli

Hi @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 nicht verwöhnen und sich eine Kopie von PhpStorm holen? 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.

P.S. Dies 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 );

Zum Beispiel:

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?

6
MikeSchinkel

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). Anschließend müssen Sie nur eine Schleife durch jede der Größen ziehen und ein Bild für diese Größe erstellen diese:

$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 oder false, um die Größe zu ändern.

0
Bainternet