Aggiungere un caricatore di immagini base alla pagina del profilo utente
Sto cercando di aggiungere un caricatore di immagini alle pagine del profilo utente. Ho già implementato con successo questa funzionalità in una pagina di registrazione base, ma lo stesso codice, leggermente modificato, non funziona quando aggiunto a functions.php. Il campo viene caricato e WordPress permette l'aggiornamento, ma nella visualizzazione del profilo l'immagine non viene mostrata. Per ottenere e salvare l'immagine uso:
/********************************************************************
Codice per il campo di upload immagine profilo
*********************************************************************/
require_once( STYLESHEETPATH . '/img_upload_resize_crop.php' );
add_action( 'init', 'custom_img_uploader' );
function custom_img_uploader () {
global $profilePicture;
if (isset($_FILES['profilePicture']['name'])!= "" ) {
if ( $_FILES['profilePicture']['name']!="" ) {
$your_image = new _image;
$upload_dir = wp_upload_dir();
//Per l'upload
$your_image->uploadTo = $upload_dir['basedir'].'/';
$upload = $your_image->upload($_FILES['profilePicture']);
//Per il ridimensionamento
$your_image->newPath = $upload_dir['basedir'].'/thumbs/';
$your_image->newWidth = 150;
$your_image->newHeight = 200;
$resized = $your_image->resize();
$profilePicture=str_replace($upload_dir['basedir'].'/thumbs/', "", $resized );
unlink($upload);
}else{
$profilePicture='';
}
}
}
Per mostrare il campo in HTML ho:
<!-- inizio campo caricatore immagini -->
<tr>
<th><label for="profilePicture"><?php _e("Immagine Profilo"); ?></label></th>
<td>
<input type="file" name="profilePicture" id="profilePicture" style="float:left;" />
</td>
</tr>
E per salvarlo uso questo:
update_user_meta( $user_id, 'userphoto_thumb_height', 59);
update_user_meta( $user_id, 'userphoto_thumb_width', 80 );
update_user_meta( $user_id, 'userphoto_thumb_file', $profilePicture );
Qualcuno capisce perché nella visualizzazione Profilo questo codice:
<?php if(get_the_author_meta( 'userphoto_thumb_file', $getId )!=""){?>
<img src="<?=$uploads['baseurl'];?>/thumbs/<?=get_the_author_meta( 'userphoto_thumb_file', $getId );?>" />
<?php } ?>
non carica l'immagine salvata?
Aggiornamento I e II
Debug di base
Aggiornamento III
Dopo aver aggiunto un isset()
ho fatto qualche progresso:
[28-Mar-2012 07:14:46] PHP Notice: Undefined variable: profilePicture in /home/user/public_html/wp-content/themes/theme-name/functions.php on line 346
Su quella linea ho update_user_meta( $user_id, 'userphoto_thumb_file', $profilePicture );
Sembra che nonostante abbia definito la variabile Era solo un notice e non sembra essere rilevante né causare il problema di upload.profilePicture
, non venga presa
Aggiornamento IV
Ho incapsulato il codice del caricatore immagini in una funzione e l'ho aggiunta come action. Vedi codice con aggiornamenti sopra. Ho ancora una variabile non definita profilePicture
e l'immagine non viene caricata. L'intero file functions.php è qui http://pastebin.com/YGYz3Qnv
Aggiornamento V
Mi sono reso conto che non ho una buona opzione $_POST per profilePicture. Guardando il plugin menzionato da @brasofilo a http://plugins.svn.wordpress.org/user-avatar/trunk/user-avatar.php vedo questo codice che potrei usare, ma devo adattarlo molto:
<form enctype="multipart/form-data" id="uploadForm" method="POST" action="<?php echo admin_url('admin-ajax.php'); ?>?action=user_avatar_add_photo&step=2&uid=<?php echo $uid; ?>" >
<label for="upload"><?php _e('Scegli un'immagine dal tuo computer:','user-avatar'); ?></label><br /><input type="file" id="upload" name="uploadedfile" />
<input type="hidden" name="action" value="save" />
<?php wp_nonce_field('user-avatar') ?>
<p class="submit"><input type="submit" value="<?php esc_attr_e('Carica'); ?>" /></p>
</form>
Mi chiedo se sia necessario un form visto che non lo era per gli altri campi testo e come devo aggiungere $user_id
e modificare update_user_meta
Aggiornamento VI
Ho reso $profilePicture
globale come suggerito da un collaboratore
Aggiornamento VII
Sto valutando di usare l'opzione da Unrelated Media qui. Ma dato che ci vorrà ancora del tempo per integrarlo nel mio functions.php attuale, terrò questo thread aperto finché non ci sarò riuscito.

Controlla questo plugin: User Avatar. Puoi utilizzarlo o esaminarne le funzioni per adattare il tuo.

$profilePicture
è definita al di fuori dell'ambito del codice di salvataggio e non è mai dichiarata o utilizzata nell'ambito globale.
Di conseguenza, non appena la funzione di upload restituisce il valore, la variabile viene eliminata dal garbage collector, oppure stai gestendo una variabile completamente diversa che condivide lo stesso nome.
La dichiarerei come globale e aggiungerei ulteriori controlli di validazione, come verificare se la variabile è vuota prima di provare a utilizzarla.

Ho aggiornato il codice - vedi http://pastebin.com/YGYz3Qnv - e ho reso $profilePicture
globale. Grazie per la segnalazione! Come posso aggiungere più validazione per verificare se la variabile è vuota? isset()
è già stato aggiunto.. E penso di avere ancora un problema con $_POST..

Preferisco usare if(empty()){ poiché controlla anche gli array vuoti, potresti anche aver bisogno di far usare al form la codifica multipart, anche se non ricordo un sito/risposta che lo spieghi, quindi posterò a breve, ma fai riferimento al plugin User Photo

Guardando il pastebin, non hai affatto reso la variabile globale, osservando la funzione rilevante sembra identica, non c'è global $profilePicture; nella funzione custom_img_uploader

Vedendo tutto il tuo codice, non sono sicuro del perché il processo di upload sia in una funzione separata su un hook init, non sarebbe meglio immediatamente sopra le chiamate update_usermeta?

Penso che sarebbe meglio usare qualcosa come il plugin UserPhoto invece, funziona e ha più funzionalità e opzioni

Sto verificando http://wordpress.org/extend/plugins/user-photo/ ora. Potrebbe essere una buona idea. Devo solo modificare il mio modulo di registrazione per memorizzare l'immagine allo stesso modo così l'aggiornamento funzionerà in seguito. Caricare l'immagine nella visualizzazione del profilo potrebbe non essere troppo difficile purché possa in qualche modo ottenere l'userid così viene caricata l'immagine del profilo corretta. Poiché tutti questi fattori contano, speravo di poter rimanere al codice che ho così devo modificare solo functions.php, non il modulo di registrazione e la visualizzazione del profilo. Non sono un completo principiante in PHP, ma ho ancora moooolto da imparare

Ho chiesto allo sviluppatore di UserPhoto se fosse già stata implementata una modulistica di registrazione qui: http://wordpress.org/support/topic/plugin-user-photo-registration-usage?replies=1#post-2721403. Chissà..

Passerei dall'utilizzo dei dati FILES e post, a fare affidamento sulle API di WordPress per i tuoi file. In questo modo invece di un percorso del file, ottieni l'ID di un post type di tipo attachment, e puoi ridurre tutto il tuo codice di upload in poche chiamate di funzione che fanno tutto automaticamente. Poi quando vuoi visualizzare il tuo 'avatar', usa semplicemente le funzioni per gli attachment delle immagini che vengono utilizzate ovunque

continuiamo questa discussione nella chat

Grazie a tutti per i vostri suggerimenti. Alla fine ho optato per l'integrazione del Woothemes Media Uploader come potete vedere qui su Github: https://github.com/devinsays/options-framework-plugin/blob/master/options-medialibrary-uploader.php È integrato in un framework per temi che sto incorporando nel mio tema personale, in questo modo posso prendere due piccioni con una fava.
