Datei-Upload-Frontend ACF und Gravity Form

Mit Schwerkraftformularen als Frontend-Datei-Uploader können Benutzer Galeriebilder über ein Formular hochladen, das dann in einem ACF-Galeriefeld (erweiterte benutzerdefinierte Formulare) gespeichert wird.

Es funktioniert bis zu einem gewissen Punkt, das Formular lädt die Bilder hoch und sie werden im Gravity-Form-Eintrag gespeichert (Sie können die Bilder gut sehen).

Der zweite Teil des folgenden Codes versucht, das Bild von der Gravitationsformularanlage als Post-Attachment in die Medienbibliothek zu verschieben

Dies ist, wo es fehlschlägt, den Bilddateinamen aber ein zerbrochenes Bild (0kb groß) belassen.

Der ursprüngliche Code kann hier gefunden werden, aber ich weiß nicht, wo das Problem liegt: https://joshuadnelson.com/connect-gravity-forms-file-upload-to-acf-gallery-field/

/** * Attach images uploaded through Gravity Form to ACF Gallery Field * * @return void */ $gravity_form_id = 10; // gravity form id, or replace {$gravity_form_id} below with this number add_filter( "gform_after_submission_{$gravity_form_id}", 'jdn_set_post_acf_gallery_field', 10, 2 ); function jdn_set_post_acf_gallery_field( $entry, $form ) { $gf_images_field_id = 69; // the upload field id $acf_field_id = 'field_59e260b6e28fd'; // the acf gallery field id // get post, if there isn't one, bail if( isset( $entry['post_id'] ) ) { $post = get_post( $entry['post_id'] ); if( is_null( $post ) ) return; } else { return; } // Clean up images upload and create array for gallery field if( isset( $entry[ $gf_images_field_id ] ) ) { $images = stripslashes( $entry[ $gf_images_field_id ] ); $images = json_decode( $images, true ); if( !empty( $images ) && is_array( $images ) ) { $gallery = array(); foreach( $images as $key => $value ) { // NOTE: this is the other function you need: https://gist.github.com/joshuadavidnelson/164a0a0744f0693d5746 if( ! class_exists( 'JDN_Create_Media_File' ) ) break; // Create the media library attachment and store the attachment id in the gallery array $create_image = new JDN_Create_Media_File( $value, $post->ID ); $image_id = $create_image->attachment_id; if( absint( $image_id ) ) { $gallery[] = $image_id; } } } } // Update gallery field with array if( ! empty( $gallery ) ) { update_field( $acf_field_id, $gallery, $post->ID ); } } 

__

  image_url = esc_url( $image_url ); $this->post_id = absint( $post_id ); $this->wp_upload_url = $this->get_wp_upload_url(); $this->attachment_id = $this->attachment_id ?: false; return $this->create_image_id(); } /** * Set the upload directory */ private function get_wp_upload_url() { $wp_upload_dir = wp_upload_dir(); return isset( $wp_upload_dir['url'] ) ? $wp_upload_dir['url'] : false; } /** * Create the image and return the new media upload id. * * @see https://gist.github.com/hissy/7352933 * * @see http://codex.wordpress.org/Function_Reference/wp_insert_attachment#Example */ public function create_image_id() { if( $this->attachment_id ) return $this->attachment_id; if( empty( $this->image_url ) || empty( $this->wp_upload_url ) ) return false; $filename = basename( $this->image_url ); $upload_file = wp_upload_bits( $filename, null, file_get_contents( $this->image_url ) ); if ( ! $upload_file['error'] ) { $wp_filetype = wp_check_filetype( $filename, null ); $attachment = array( 'post_mime_type' => $wp_filetype['type'], 'post_parent' => $this->post_id, 'post_title' => preg_replace('/\.[^.]+$/', '', $filename), 'post_content' => '', 'post_status' => 'inherit' ); $attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], $this->post_id ); if( ! is_wp_error( $attachment_id ) ) { require_once( ABSPATH . "wp-admin" . '/includes/image.php' ); require_once( ABSPATH . 'wp-admin/includes/media.php' ); $attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] ); wp_update_attachment_metadata( $attachment_id, $attachment_data ); $this->attachment_id = $attachment_id; return $attachment_id; } } return false; } // end function get_image_id } 

Solutions Collecting From Web of "Datei-Upload-Frontend ACF und Gravity Form"

Eine noch einfachere Option ist die Verwendung meines Gravity Forms Media Library Plugins. Hier ist das Fleisch und die Kartoffeln der functionalität:

 public function maybe_upload_to_media_library( $entry, $form ) { $has_change = false; foreach( $form['fields'] as $field ) { if( ! $this->is_applicable_field( $field ) ) { continue; } $value = $entry[ $field->id ]; if( $field->multipleFiles ) { $value = json_decode( $value ); } if( empty( $value ) ) { continue; } $has_change = true; $ids = $this->upload_to_media_library( $value, $field, $entry ); $new_value = array(); if( is_wp_error( $ids ) ) { continue; } foreach( $ids as $id ) { if( ! is_wp_error( $id ) ) { $new_value[] = wp_get_attachment_url( $id ); } } if( $field->multipleFiles ) { $new_value = json_encode( $new_value ); } else { $new_value = $new_value[0]; $ids = $ids[0]; } $entry[ $field->id ] = $new_value; $this->update_file_ids( $entry['id'], $field->id, $ids ); } if( $has_change ) { GFAPI::update_entry( $entry ); } return $entry; } 

Aber … es behandelt auch eine Menge anderer Anwendungsfälle, die Sie möglicherweise nicht in Betracht ziehen, wie das Aktualisieren des Eintrags, das Hochladen mehrerer Dateien und die automatische Integration mit verschiedenen bildbasierten benutzerdefinierten Feldtypen von ACF.

Ich hatte ein ähnliches Problem und fand eine Lösung für mein spezifisches Problem mit ‘media_handle_upload’ ( https://codex.wordpress.org/Function_Reference/media_handle_upload ).

Zuerst – Vergewissern Sie sich, dass Ihr Formular das Attribut ‘enctype =’ multipart / form-data ‘hat.

Zweitens – Stellen Sie sicher, dass Ihre ‘input = file’ kein Wertattribut hat.

Drittens : Benutze ‘media_handle_upload’ und gib den Namen deiner ‘input = file’ weiter.

Forth – Überprüfen Sie, ob beispielsweise ein Fehler mit ‘is_wp_error’ aufgetreten ist.

Fünftens – Aktualisieren Sie das Benutzer-Meta mit dem Namen des Feldes, das Sie aktualisieren möchten (in meinem Fall ist das derselbe wie der ‘Name’ der ‘Eingabe = Datei’).

Meine Frage und vollständige Antwort sind hier: ACF Upload Bild im Front-End mit benutzerdefiniertem Formular

Hoffe, dass mein Code dir bei deiner Frage helfen kann … Wahrscheinlich kann es, du musst es nur anpassen.