ACF Carica Immagine in front-end con form personalizzato
Ho creato dei campi aggiuntivi per i miei iscritti, uno di questi è un campo immagine, in modo che possano caricare un'immagine per il loro profilo.
Ho creato i campi con ACF (Advanced Custom Fields).
Ho un form di registrazione personalizzato e un form di modifica, con i campi standard di WordPress e quelli aggiuntivi. Tutto funziona perfettamente... tranne il campo immagine.
Non mi preoccupa il form di registrazione, accetto che l'utente non carichi l'immagine durante la registrazione, ma ho bisogno che possa modificare/caricare l'immagine quando modifica le sue informazioni.
Ps.(1): L'immagine verrà utilizzata come avatar, non userò l'avatar standard di WordPress.
Ps.(2): Non userò acf_form() perché ho bisogno di personalizzare molto il funzionamento del form.
Ecco parte del codice:
<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'] ) );

Ok, ho fatto funzionare con 'media_handle_upload' (segnalato da @Piyush) e modificando un po' il codice del mio form.
Ecco cosa ho fatto:
Primo - Assicurati che il tuo form abbia l'attributo 'enctype='multipart/form-data'.
Secondo - Assicurati che il tuo 'input=file' non abbia l'attributo value.
Terzo - Usa 'media_handle_upload' e passa il nome del tuo 'input=file'.
Quarto - Controlla se ci sono errori con 'is_wp_error', per esempio.
Quinto - Aggiorna i metadati dell'utente usando il nome del campo che vuoi aggiornare (nel mio caso, è lo stesso del 'name' dell'input=file).
Ecco parte del codice finale:
<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('SALVA', 'profile'); ?>" />
<input name="action" type="hidden" id="action" value="update-user" />
</form>
/* Se il profilo è stato salvato, aggiorna il profilo. */
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {
// Questi file devono essere inclusi come dipendenze quando si lavora sul 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' );
// Lascia che WordPress gestisca l'upload.
$img_id = media_handle_upload( 'avatar_user', 0 );
if ( is_wp_error( $img_id ) ) {
echo "Errore";
} else {
update_user_meta( $current_user->ID, 'avatar_user', $img_id );
}
}

Forse qualcosa come questo potrebbe aiutare:
// Gestisci le immagini caricate dal front-end permettendo ad ACF di fare il suo lavoro
function my_acf_pre_save_post($post_id) {
if ( !function_exists('wp_handle_upload') ) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
}
// Sposta il file nella libreria media
$movefile = wp_handle_upload( $_FILES['my_image_upload'], array('test_form' => false) );
// Se lo spostamento è avvenuto con successo, inserisci l'allegato di 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']);
// Assegna il file come immagine in evidenza
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');
Copia il codice da questo articolo, la pagina che ho linkato sotto rompe la formattazione quindi l'ho sistemata nel campione qui sopra.
Fonte: https://support.advancedcustomfields.com/forums/topic/uploading-imagefile-on-the-front-end/

Sembra promettente. Lo proverò appena possibile. Grazie

Il problema con questo esempio è che sembra essere utilizzato per un post, ecco perché usano 'set_post_thumbnail'. Nel mio caso, ho bisogno di usare l'immagine su un input ACF, nel profilo utente.

Ce l'ho fatta a farlo funzionare con 'media_handle_upload()'
