Aggiungere un caricatore di immagini base alla pagina del profilo utente

27 mar 2012, 16:47:23
Visualizzazioni: 14.2K
Voti: 7

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 profilePicture, non venga presa Era solo un notice e non sembra essere rilevante né causare il problema di upload.

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.

4
Commenti

Dai un'occhiata, usa il plugin integrato Plupload http://kovshenin.com/2012/dear-wordpress-i-want-to-drop-files-here-in-the-visual-editor/

soulseekah soulseekah
28 mar 2012 15:31:12

Le immagini del profilo devono essere aggiunte a una cartella specifica e il percorso deve essere aggiunto a un campo user_meta specifico in modo che la pagina del profilo possa caricare l'immagine collegata a un ID utente con <?php if(get_the_author_meta( 'userphoto_thumb_file', $getId )!=""){?> <img src="<?=$uploads['baseurl'];?>/thumbs/<?=get_the_author_meta( 'userphoto_thumb_file', $getId );?>" /> Non vedo come il codice di Koshenin possa ottenere questo risultato. Ma lo controllerò. Ho visto che hai aiutato anche tu Soulseekah!

rhand rhand
28 mar 2012 17:30:20

@Soulseekah La funzione di drag-and-drop di quel plugin è davvero fantastica, devo dire! Ma per la mia situazione ho solo bisogno che funzioni un caricatore di immagini per il profilo. Spero davvero che il plugin di tuo fratello venga accettato nel core perché è fantastico!

rhand rhand
28 mar 2012 17:50:21

Forse un'implementazione come quella nel esempio di plupload potrebbe essere una cosa interessante. Sembra sia sufficiente accodare correttamente gli script e scegliere un <div> come uploader. Serve solo che i dati siano memorizzati per un utente in modo che un'immagine specifica venga caricata per profilo.

rhand rhand
28 mar 2012 18:07:07
Tutte le risposte alla domanda 3
1

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

29 mar 2012 05:32:27
Commenti

L'ho verificato e mi chiedevo se fosse possibile utilizzare parte del suo codice - vedi aggiornamento nella domanda.

rhand rhand
29 mar 2012 15:23:36
10

$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.

29 mar 2012 14:28:24
Commenti

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..

rhand rhand
29 mar 2012 15:22:44

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

Tom J Nowell Tom J Nowell
29 mar 2012 15:59:01

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

Tom J Nowell Tom J Nowell
29 mar 2012 17:15:25

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?

Tom J Nowell Tom J Nowell
29 mar 2012 17:16:03

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

Tom J Nowell Tom J Nowell
29 mar 2012 17:16:51

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

rhand rhand
30 mar 2012 03:17:08

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à..

rhand rhand
30 mar 2012 03:25:28

Aha, non sapevo che volessi anche un caricatore pubblico.

Tom J Nowell Tom J Nowell
30 mar 2012 12:20:07

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

Tom J Nowell Tom J Nowell
30 mar 2012 12:21:31

continuiamo questa discussione nella chat

rhand rhand
30 mar 2012 14:03:15
Mostra i restanti 5 commenti
0

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.

25 mag 2012 08:12:08