Încărcare imagine ACF în front-end cu formular personalizat
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'] ) );

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

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/

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

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.
