Încărcare imagine ACF în front-end cu formular personalizat

11 oct. 2017, 14:50:02
Vizualizări: 19.3K
Voturi: 0

Am creat câmpuri suplimentare pentru abonații mei, unul dintre ele fiind un câmp pentru imagini, astfel încât să poată încărca o imagine în profilul lor.

Am creat câmpurile cu ACF (Advanced Custom Fields).

Am un formular de înregistrare personalizat și un formular de editare personalizat, cu câmpurile obișnuite din WordPress și cele suplimentare. Totul funcționează perfect... Cu excepția câmpului pentru imagine.

Nu mă îngrijorează formularul de înregistrare, accept ca utilizatorul să nu încarce imaginea la înregistrare, dar trebuie să poată edita/încărca imaginea când își modifică informațiile.

Ps.(1): Imaginea va fi folosită ca avatar, nu voi folosi avatarul standard din WordPress.

Ps.(2): Nu voi folosi acf_form() pentru că trebuie să modific prea mult modul în care funcționează formularul.

Iată o parte din cod:

<label for="avatar_user"></label>
<input class="text-input" name="avatar_user" type="file" id="avatar_user" value="<?php the_author_meta( 'avatar_user', $current_user->ID ); ?>" />

if ( !empty( $_POST['avatar_user'] ) ) :
   update_user_meta( $current_user->ID, 'avatar_user', esc_attr( $_POST['avatar_user'] ) );
10
Comentarii

ACF vă permite să stocați și URL-ul imaginii, puteți gestiona încărcarea avatarului personalizat prin funcția media_handle_upload() în WordPress și să introduceți URL-ul în câmpul ACF

Piyush Rawat Piyush Rawat
11 oct. 2017 15:20:55

Deci, care este întrebarea de fapt? Te rugăm să editezi întrebarea și să clarifici ce anume întrebi

Mark Kaplun Mark Kaplun
11 oct. 2017 15:46:26

Întrebarea este destul de clară atât în titlu, cât și în text. Nu este nevoie de editare.

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 oct. 2017 15:50:13

Cred că 'media_handle_upload()' ar putea fi soluția. O să încerc cât de curând și voi vedea dacă funcționează. Mulțumesc @Piyush

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 oct. 2017 15:52:32

@MarceloHenriquesCortez da...am mai folosit-o înainte...dar nu știu cazul tău de utilizare...poți încerca să vezi dacă merge

Piyush Rawat Piyush Rawat
11 oct. 2017 15:55:35

Am reușit să funcționeze cu 'media_handle_upload()'. Mulțumesc pentru îndrumare

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 oct. 2017 14:56:27

titlu înșelător și întrebare confuză.

Sunil Kumar Sunil Kumar
10 iul. 2020 09:27:33

@SunilKumar Tu ești singurul cu această problemă =)

Marcelo Henriques Cortez Marcelo Henriques Cortez
13 iul. 2020 16:40:00

Mark Kaplun va fi de acord cu mine.

Sunil Kumar Sunil Kumar
14 iul. 2020 13:35:05

@SunilKumar orice

Marcelo Henriques Cortez Marcelo Henriques Cortez
12 dec. 2021 00:05:21
Arată celelalte 5 comentarii
Toate răspunsurile la întrebare 2
0

Bine, am reușit să funcționeze cu 'media_handle_upload' (sugerat de @Piyush) și cu câteva ajustări în codul formularului meu.

Iată ce am făcut:

Primul pas - Asigură-te că formularul tău are atributul 'enctype='multipart/form-data'.

Al doilea pas - Verifică dacă 'input=file' nu are atributul value.

Al treilea pas - Folosește 'media_handle_upload' și transmite numele 'input=file'.

Al patrulea pas - Verifică dacă a apărut o eroare cu 'is_wp_error', de exemplu.

Al cincilea pas - Actualizează user meta folosind numele câmpului pe care vrei să îl actualizezi (în cazul meu, este același cu 'name' din 'input=file').

Iată o parte din codul final:

<form method="post" id="adduser" enctype='multipart/form-data'>
    <input class="text-input" name="avatar_user" type="file" id="avatar_user" multiple="false"/>
    <input name="updateuser" type="submit" id="updateuser" class="submit button" value="<?php _e('SALVEAZĂ', 'profile'); ?>" />
    <input name="action" type="hidden" id="action" value="update-user" />
</form>

/* Dacă profilul a fost salvat, actualizează profilul. */
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {

    // Aceste fișiere trebuie incluse ca dependințe când sunt pe partea de front-end.
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    // Lasă WordPress să gestioneze încărcarea.
    $img_id = media_handle_upload( 'avatar_user', 0 );

    if ( is_wp_error( $img_id ) ) {
      echo "Eroare";
    } else {
      update_user_meta( $current_user->ID, 'avatar_user', $img_id );
    }
}
16 oct. 2017 14:55:59
4

Poate ceva de genul acesta te va ajuta:

// Gestionează imaginile încărcate din front-end, permițând ACF să-și facă treaba
function my_acf_pre_save_post($post_id) {

if ( !function_exists('wp_handle_upload') ) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
}

// Mută fișierul în biblioteca media
$movefile = wp_handle_upload( $_FILES['my_image_upload'], array('test_form' => false) );

// Dacă mutarea a fost realizată cu succes, inserează atașamentul WordPress
if ( $movefile && !isset($movefile['error']) ) {
$wp_upload_dir = wp_upload_dir();
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . basename($movefile['file']),
'post_mime_type' => $movefile['type'],
'post_title' => preg_replace( '/\.[^.]+$/', ”, basename($movefile['file']) ),
'post_content' => ”,
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment($attachment, $movefile['file']);

// Atribuie fișierul ca imagine reprezentativă
set_post_thumbnail($post_id, $attach_id);
update_field('my_image_upload', $attach_id, $post_id);

}

return $post_id;

}

add_filter('acf/pre_save_post' , 'my_acf_pre_save_post');

Copiază codul din acest post, pagina la care am trimis link-ul mai jos distruge formatarea, așa că l-am reparat în exemplul de mai sus.

Sursă: https://support.advancedcustomfields.com/forums/topic/uploading-imagefile-on-the-front-end/

11 oct. 2017 15:35:30
Comentarii

Sună promițător. O să încerc cât de curând pot. Mersi

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 oct. 2017 15:54:04

Problema cu acest exemplu este că pare să fie folosit pentru un articol, de aceea folosesc 'set_post_thumbnail'. În cazul meu, trebuie să folosesc imaginea pe un câmp ACF, în profilul utilizatorului.

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 oct. 2017 13:58:33

Am reușit să funcționeze cu 'media_handle_upload()'

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 oct. 2017 14:56:42

Am marcat-o ca fiind utilă pentru că probabil poate ajuta alți utilizatori în probleme specifice. Deoarece am găsit soluția care funcționează cu codul meu, nu știu dacă va funcționa pentru toată lumea.

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 oct. 2017 17:21:33