Cum să adaugi un încărcător de imagini pe pagina de profil utilizator

27 mar. 2012, 16:47:23
Vizualizări: 14.2K
Voturi: 7

Încerc să adaug un încărcător de imagini pe paginile de profil ale utilizatorilor. Am reușit să-l implementez pe o pagină de înregistrare de bază, dar același cod, ușor modificat, nu funcționează când este adăugat în functions.php. Câmpul se încarcă și WordPress permite actualizarea ușoară, dar în vizualizarea profilului nu este afișată nicio imagine. Pentru a obține și stoca imaginea folosesc:

/********************************************************************
Cod pentru câmpul de încărcare imagine profil
*********************************************************************/
require_once( STYLESHEETPATH . '/img_upload_resize_crop.php' );

add_action( 'init', 'custom_img_uploader' );

function custom_img_uploader () {

    if (isset($_FILES['profilePicture']['name'])!= "" ) {

if ( $_FILES['profilePicture']['name']!="" ) {
    $your_image = new _image;
    $upload_dir = wp_upload_dir();
    //Pentru încărcare
    $your_image->uploadTo = $upload_dir['basedir'].'/';
    $upload = $your_image->upload($_FILES['profilePicture']);


    //Pentru redimensionare
    $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='';
}
}
}

Pentru a afișa câmpul în HTML am:

<!-- început câmp încărcător imagine -->
<tr>
<th><label for="profilePicture"><?php _e("Imagine Profil"); ?></label></th>
<td>
<input type="file" name="profilePicture" id="profilePicture" style="float:left;" />
</td>
</tr>

Și pentru a salva imaginea folosesc:

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

Vede cineva de ce în vizualizarea profilului acest cod:

<?php if(get_the_author_meta( 'userphoto_thumb_file', $getId )!=""){?>
                        <img src="<?=$uploads['baseurl'];?>/thumbs/<?=get_the_author_meta( 'userphoto_thumb_file', $getId );?>" />

nu încarcă imaginea stocată?

Actualizare I și II

Depanare de bază

Actualizare III După adăugarea unui isset() am ajuns puțin mai departe:

[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

Pe acea linie am update_user_meta( $user_id, 'userphoto_thumb_file', $profilePicture ); Se pare că, deși am definit variabila profilePicture, aceasta nu este preluată Era doar o notificare și nu pare să fie relevantă sau să cauzeze problema de încărcare.

Actualizare IV

Am încapsulat codul încărcătorului de imagini într-o funcție și l-am adăugat ca acțiune. Vezi codul cu actualizările de mai sus. Încă am o variabilă nedefinită profilePicture și nici imaginea nu se încarcă. Fișierul întreg functions.php este aici http://pastebin.com/YGYz3Qnv

Actualizare V

Tocmai am realizat că nu am o opțiune bună $_POST pentru profilePicture. Privind pluginul menționat de @brasofilo la http://plugins.svn.wordpress.org/user-avatar/trunk/user-avatar.php văd acest cod pe care aș putea să-l folosesc, dar trebuie să-l adaptez mult:

<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('Alege o imagine de pe 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('Încarcă'); ?>" /></p>
    </form>

Mă întreb dacă este nevoie de un formular, deoarece nu a fost necesar pentru alte câmpuri text și cum trebuie să adaug $user_id și cum să ajustez update_user_meta

Actualizare VI

Am făcut $profilePicture globală conform recomandării contributorului

Actualizare VII

Mă gândesc să folosesc opțiunea de la Unrelated Media aici. Dar, deoarece va dura încă ceva timp până voi integra acest lucru în fișierul meu curent functions.php, voi păstra acest thread deschis până voi reuși să fac acest lucru.

4
Comentarii

Verifica asta, folosește plugin-ul încorporat 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

Imaginile de profil trebuie adăugate într-un folder specific și calea trebuie adăugată într-un câmp user_meta specific, astfel încât pagina de profil să poată încărca imaginea asociată unui ID de utilizator cu <?php if(get_the_author_meta( 'userphoto_thumb_file', $getId )!=""){?> <img src="<?=$uploads['baseurl'];?>/thumbs/<?=get_the_author_meta( 'userphoto_thumb_file', $getId );?>" /> Nu văd cum codul lui Koshenin poate realiza asta. Dar o să verific. Am văzut că ai ajutat și tu cu asta Soulseekah!

rhand rhand
28 mar. 2012 17:30:20

@Soulseekah Funcționalitatea de drag-and-drop a acelui plugin este chiar foarte tare! Dar în situația mea am nevoie doar ca un încărcător de imagini de profil să funcționeze. Sper că plugin-ul fratelui tău va fi acceptat în nucleu, pentru că este minunat!

rhand rhand
28 mar. 2012 17:50:21

Poate o implementare precum cea de la exemplul plupload ar putea fi ceva interesant. Pare să fie nevoie doar să încărcăm scripturile corespunzător și să alegem un <div> ca încărcător. Este necesar doar să stocăm datele pentru un utilizator, astfel încât o anumită imagine să fie încărcată pe profil.

rhand rhand
28 mar. 2012 18:07:07
Toate răspunsurile la întrebare 3
1

Verifică acest plugin: User Avatar. Îl poți folosi sau poți analiza funcțiile sale pentru a le adapta la ale tale.

29 mar. 2012 05:32:27
Comentarii

Am verificat-o și mă întrebam despre utilizarea unei părți din codul său - vezi actualizarea în întrebare.

rhand rhand
29 mar. 2012 15:23:36
10

$profilePicture este definită în afara domeniului de aplicare a codului de salvare și nu este niciodată declarată sau utilizată în domeniul global.

Ca urmare, imediat ce funcția de încărcare returnează, fie variabila este colectată ca deșeu, fie aveți de-a face cu o variabilă complet diferită care are același nume.

Aș declara-o ca globală și aș adăuga mai multă validare, cum ar fi verificarea dacă variabila este goală înainte de a încerca să o utilizați.

29 mar. 2012 14:28:24
Comentarii

Am actualizat codul - vezi http://pastebin.com/YGYz3Qnv - și am făcut $profilePicture global. Mulțumesc pentru atenționare! Cum pot adăuga mai multă validare pentru a verifica dacă variabila este goală? isset() este deja adăugat.. Și tot cred că am și o problemă cu $_POST..

rhand rhand
29 mar. 2012 15:22:44

Prefer să folosesc if(empty()){ deoarece verifică și pentru array-uri goale, poate fi necesar să faci formularul să utilizeze multipart encoding, deși nu-mi amintesc un site/răspuns care să explice asta, așa că voi posta în curând, dar consultă plugin-ul User Photo

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

Privind la pastebin, nu ai făcut deloc variabila globală, privind la funcția relevantă arată identic, nu există global $profilePicture; în funcția custom_img_uploader

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

Văzând întregul tău cod, nu sunt sigur de ce procesul de încărcare este într-o funcție separată pe un hook init, nu ar fi mai bine imediat deasupra apelurilor update_usermeta?

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

Cred că ar fi mai bine să folosești ceva de genul plugin-ului UserPhoto în schimb, funcționează și are mai multe funcții și opțiuni

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

Mă uit acum la http://wordpress.org/extend/plugins/user-photo/. Ar putea fi o idee bună. Trebuie doar să ajustez formularul meu de înregistrare pentru a stoca imaginea în același mod, astfel încât actualizarea să funcționeze mai târziu. Să încarc imaginea în vizualizarea profilului s-ar putea să nu fie prea greu, atâta timp cât pot obține cumva userid-ul pentru a se încărca poza corectă de profil. Având în vedere că toți acești factori contează, speram să pot rămâne la codul pe care îl am, astfel încât să trebuiască să modific doar functions.php, nu și formularul de înregistrare și vizualizarea profilului. Nu sunt complet începător în PHP, dar încă am muuulte de învățat

rhand rhand
30 mar. 2012 03:17:08

Am întrebat dezvoltatorul UserPhoto dacă există deja o implementare a formularului de înregistrare aici: http://wordpress.org/support/topic/plugin-user-photo-registration-usage?replies=1#post-2721403. Cine știe..

rhand rhand
30 mar. 2012 03:25:28

Aha, nu știam că vrei și un uploader accesibil publicului.

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

Aș trece de la utilizarea datelor FILES și post, la utilizarea API-urilor WordPress pentru fișierele tale. Astfel, în loc de un filepath, vei obține ID-ul unui tip de postare attachment și poți reduce tot codul tău de upload la câteva apeluri de funcții care fac totul automat. Apoi, când vrei să afișezi 'avatarul' tău, folosește pur și simplu funcțiile pentru imagini attachment care sunt folosite peste tot

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

hai să continuăm această discuție în chat

rhand rhand
30 mar. 2012 14:03:15
Arată celelalte 5 comentarii
0

Vă mulțumesc tuturor pentru sugestii. În final am ales integrarea Woothemes Media Uploader, așa cum puteți vedea aici pe Github: https://github.com/devinsays/options-framework-plugin/blob/master/options-medialibrary-uploader.php Este integrat într-un cadru de tematică pe care îl integrez în propria mea temă, astfel încât să pot omorî doi iepuri dintr-o lovitură.

25 mai 2012 08:12:08