publikacja: 17 listopada 2009, autor: , komentarzy 11 http://wpninja.pl/artykuly/tworzymy-dodatkowe-pole-w-profilu-uzytkownika/

Tworzymy dodatkowe pole w profilu użytkownika

Tworzymy dodatkowe pole w profilu użytkownika

Jeden z czytelników WPNinja zadał pytanie:

Mam na portalu kilku autorów. Chciałbym wstawić do sidebara link do profilu danego autora na forum (które jest w subdomenie, oparte na SMF). Np autor X ma profil forum.domena.pl/X; autor Y, ma profil forum.domena.pl/Y itd. Jak mogę to zrobić?

Stwierdziłem, iż najłatwiej będzie stworzyć pole użytkownika – jednak nie takie przy wpisie, a takie przy profilu.

Załóżmy więc, iż każdemu z naszych autorów chcemy dać możliwość odpowiedzi na pytanie „jaki jest Twój ulubiony kolor”, chcąc przedstawić tę odpowiedź pod wpisem danego autora.

Trzeba nam będzie więc podjąć dwa kroki:

  • stworzyć własną wtyczkę z rzędem odpowiednich funkcji,
  • wstawić mały kod do pliku single.php.

Zaczynajmy więc!

Tworzymy wtyczkę

Pisanie wtyczki zaczyna się od stworzenia odpowiedniego pliku w folderze wp-content/plugins – plik nazwijmy „kolory.php”. Otwieramy go edytorem PHP i wstawiamy kod:

<?php
/*
Plugin Name: Kolory autora
Plugin URI: http://wpninja.pl
Description: Aby inwigilować autorów...
Author: Nathan
Version: 0.0.1
Author URI: http://usarzewicz.org
*/

Tak oto stworzyliśmy swoją własną wtyczkę do WordPressa – wtyczka działa, wyświetlana jest w panelu zarządzania wtyczkami, póki co jeszcze jednak nic nie robi. Aby zaczęła coś robić, musimy wstawić trzy funkcje.

Nasza wtyczka widoczna na ekranie wtyczek

Nasza wtyczka widoczna na ekranie wtyczek

Wstawiamy formularz do profilu użytkownika

Oto kolejne linijki kodu.

// Wstawiamy formularz
function kolory_formularz() // otwieramy funkcję
{
global $wpdb, $user_ID; // przypisujemy zmienne globalne
$kolory_odpowiedz = get_usermeta($user_ID,'kolory_odpowiedz',TRUE); // wyciągamy z bazy odpowiedź, jeśli użytkownik wcześniej jej udzielił
 
?>
<h3>Odpowiedz na poniższe pytanie</h3>
 
<table>
<tr>
<th><label for="kolory_odpowiedz">Jaki jest Twój ulubiony kolor</label></th>
<td><input type="text" name="kolory_odpowiedz" id="kolory_odpowiedz" value="<?php echo $kolory_odpowiedz; ?>" /></td>
</tr>
</table>
 
<?php
}

Powyższy kod wstawi nam do profilu użytkownika WordPressa dodatkowe pole tekstowe na samym dole, w którym będzie można udzielić odpowiedzi. Formularz ten jednak jeszcze się nie pokaże, bowiem brakuje ważnego fragmentu kodu, toteż nie odświeżajcie jeszcze strony ;).

Zapisujemy formularz

Teraz musimy zapisać odpowiedź, której udzielimy w nowym polu. Dane z profilu są już zapisywane przez gotowy skrypt wbudowany w WordPressa, który zapisuje standardowe pola użytkownika, naszym zadaniem jest się pod ten skrypt podpiąć poprzez akcję. Dokonamy tego już za chwilę, najpierw jednak utworzymy nową funkcję:

// Zapisujemy ustawienia
function kolory_formularz_zapisz()
{
global $wpdb, $user_ID; // ponownie wyciągamy zmienne globalne
 
if (preg_match('&profile.php&', $_SERVER['REQUEST_URI'])) {
$id = $user_ID;
}
elseif($_GET['user_id']) {
$id = $_GET['user_id'];
} // wyciągamy ID użytkownika
 
if($_POST['kolory_odpowiedz']) { update_usermeta($id ,'kolory_odpowiedz', $_POST['kolory_odpowiedz']);  } else { update_usermeta($id, 'kolory_odpowiedz', ''); } // ta linia zapisuje naszą odpowiedź
}

Ta oto funkcja zapisze odpowiedź na pytanie o kolor.

Wyciągamy odpowiedź z bazy i szlifujemy całość

Potrzebujemy jeszcze jednej funkcji.

// Wyciagamy odpowiedz z bazy
function kolory_odpowiedz($id = "")
{
global $wpdb, $user_ID;
$kolory_odpowiedz = get_usermeta($user_ID,'kolory_odpowiedz',TRUE);
return $kolory_odpowiedz;
}

Funkcja kolory_odpowiedz() za chwilę zostanie użyta to wyciągnięcia z bazy danych odpowiedzi. Ostatnie dwie linie kodu, które musimy wpisać to:

add_action('show_user_profile', 'kolory_formularz');
add_action('profile_update', 'kolory_formularz_zapisz');
 
?>

Pierwsza z tych linii wyświetli formularz w panelu użytkownika, druga zaś podepnie funkcję zapisywania odpowiedzi pod wbudowany skrypt WordPressa. Oczywiście na końcu zamykamy tag PHP i tym sposobem napisaliśmy wtyczkę.

Dodatkowe pole widoczne w profilu

Dodatkowe pole widoczne w profilu

Wyświetlamy dane na stronie wpisu

Teraz pozostaje nam otworzyć plik single.php i w zasięgu pętli (the_loop()) wyświetlić odpowiedź autora na nasze pytanie. Wybieramy miejsce, które nas interesuje i wstawiamy kod:

<?php if ( kolory_odpowiedz(get_the_author_id()) != null ) : ?>Ulubiony kolor autora to: <strong><?php echo kolory_odpowiedz(get_the_author_id()); ?></strong><?php endif; ?>

I tym sposobem wszystko działa tak, jak trzeba. Funkcja get_the_author_id() wyciąga z bazy ID autora, które jest przekazywane do naszych funkcji we wtyczce, które dalej wyciągają odpowiednią wartość z bazy danych, w tym przypadku odpowiedź na pytanie o kolor ;). Jeśli zaś autor odpowiedzi nie podał i pole jest puste, nic nie zostanie wyświetlone.

Odpowiedź widoczna przy wpisie

Odpowiedź widoczna przy wpisie

Podsumowanie

Dzięki powyższej wiedzy bez problemu będziecie mogli stworzyć własne pola użytkownika, dzięki którym wyświetlicie np. linki do Blipa, Flakera czy Twittera, czy całej masy innych serwisów, a przecież nie muszą to być koniecznie linki.

Jeśli poradnik wam się spodobał, wesprzyjcie studenta dotacją, bo Wrocław drogie miasto, a studia jeszcze droższe :).

Komentarze

  1. marsjaninzmarsa 7 lat temu:

    No, nareszcie prawdziwy artykuł – oby takich więcej. :)
    Jak napisać swoją wtyczkę – tego jeszcze nie było, do tego napisane w prosty sposób… Tak trzymać, chlopaki…! ;)

    odpowiedz
  2. Damian 7 lat temu:

    Widzę, że Nat powoli zaczyna dominować na WPNinja ;) Artykuł przydatny, dzięki ;)

    odpowiedz
  3. aniec2 7 lat temu:

    Kawał mięsiwa! Więcej proszę!

    odpowiedz
  4. kicay 7 lat temu:

    słuchajcie a może wiecie jak podziałać żeby zwykły użytkownik nie mógł włączyć niczego w stylu „inne wiadomości wordpress” czy „właśnie teraz”?

    odpowiedz
  5. Nathan Usarzewicz 7 lat temu:

    Dzięki panie i panowie za miłe słowa.

    @kicay,
    Oj nie bardzo. Trzeba by może szukać jakiejś wtyczki w sieci na zapytania np. „dashboard management”, hmm.

    odpowiedz
  6. Szymon Skulimowski 7 lat temu:

    słuchajcie a może wiecie jak podziałać żeby zwykły użytkownik nie mógł włączyć niczego w stylu „inne wiadomości wordpress” czy „właśnie teraz”?

    Da się zrobić – jeśli dam radę to napiszę o tym następny artykuł :-).

    odpowiedz
  7. Jakub Słaby 7 lat temu:

    o ile dobrze myśle, funkcja zapisu mogłaby być krótsza, jako że ID obecnie zapisywanego usera jest przekazywane przez parametr

    function kolory_formularz_zapisz($id)
    {
    global $wpdb; // ponownie wyciągamy zmienne globalne

    if($_POST[‚kolory_odpowiedz’]) { update_usermeta($id ,’kolory_odpowiedz’, $_POST[‚kolory_odpowiedz’]); } else { update_usermeta($id, ‚kolory_odpowiedz’, ”); } // ta linia zapisuje naszą odpowiedź
    }

    odpowiedz
  8. Rlyeh 6 lat temu:

    Witam,

    A jak z odpornością bazy danych na różne dziwne rzeczy, które mogą być wprowadzone przez użytkownika do bazy „z ręki”?

    odpowiedz
    1. Paweł Knapek 3 lata temu:

      Baza jak kazda inna baza. Od tego jest walidacja >> http://codex.wordpress.org/Data_Validation

      odpowiedz
  9. levre 6 lat temu:

    Mam pytanie, bo nie umiem sobie poradzić , jak wyświetlić w czystej formie tekstu, login użytkownika i stronę www którą ma w profilu

    odpowiedz

Dodaj własny komentarz