ACF Carica Immagine in front-end con form personalizzato

11 ott 2017, 14:50:02
Visualizzazioni: 19.3K
Voti: 0

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'] ) );
10
Commenti

acf ti permette di memorizzare anche l'URL dell'immagine, puoi gestire il caricamento del tuo avatar personalizzato tramite la funzione media_handle_upload() in WordPress e inserire l'URL nel campo acf

Piyush Rawat Piyush Rawat
11 ott 2017 15:20:55

quindi qual è effettivamente la domanda? per favore modifica la domanda e chiarisci cosa stai effettivamente chiedendo

Mark Kaplun Mark Kaplun
11 ott 2017 15:46:26

La domanda è abbastanza chiara nel titolo e nel testo. Non c'è bisogno di modificare.

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 ott 2017 15:50:13

Penso che 'media_handle_upload()' possa fare al caso mio. Proverò appena possibile e vedrò se funziona. Grazie @Piyush

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 ott 2017 15:52:32

@MarceloHenriquesCortez sì...l'ho già fatto in passato...ma non conosco il tuo caso d'uso...quindi puoi verificare se funziona

Piyush Rawat Piyush Rawat
11 ott 2017 15:55:35

Fatto funzionare con 'media_handle_upload()'. Grazie per avermi indirizzato nella giusta direzione

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 ott 2017 14:56:27

titolo fuorviante e domanda confusa.

Sunil Kumar Sunil Kumar
10 lug 2020 09:27:33

@SunilKumar Sei l'unico con questo problema =)

Marcelo Henriques Cortez Marcelo Henriques Cortez
13 lug 2020 16:40:00

Mark Kaplun sarà d'accordo con me.

Sunil Kumar Sunil Kumar
14 lug 2020 13:35:05

@SunilKumar qualunque cosa

Marcelo Henriques Cortez Marcelo Henriques Cortez
12 dic 2021 00:05:21
Mostra i restanti 5 commenti
Tutte le risposte alla domanda 2
0

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 );
    }
}
16 ott 2017 14:55:59
4

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/

11 ott 2017 15:35:30
Commenti

Sembra promettente. Lo proverò appena possibile. Grazie

Marcelo Henriques Cortez Marcelo Henriques Cortez
11 ott 2017 15:54:04

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.

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 ott 2017 13:58:33

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

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 ott 2017 14:56:42

L'ho contrassegnato come utile perché probabilmente può aiutare altri utenti su questioni specifiche. Dato che ho trovato la soluzione che funziona con il mio codice, non so se funzionerà per tutti.

Marcelo Henriques Cortez Marcelo Henriques Cortez
16 ott 2017 17:21:33